916

I would like to format my numbers to always display 2 decimal places, rounding where applicable.

Examples:

number     display
------     -------
1          1.00
1.341      1.34
1.345      1.35

I have been using this:

parseFloat(num).toFixed(2);

But it's displaying 1 as 1, rather than 1.00.

drudge
  • 30,947
  • 7
  • 31
  • 41
Varada
  • 12,891
  • 13
  • 45
  • 67
  • 2
    I mean if I enter 1 it will not show the number as 1.00, But if I enter 1.345 then it will show 1.35 – Varada May 26 '11 at 05:26
  • 1
    I've reworded your question to what I believe you were looking for. Please check to make sure I've understood you correctly. – drudge May 26 '11 at 17:14
  • precise rounding with ie support . https://gist.github.com/ArminVieweg/28647e735aa6efaba401 – TarranJones Sep 18 '15 at 13:01
  • Possible duplicate of [In jQuery, what's the best way of formatting a number to 2 decimal places?](http://stackoverflow.com/questions/477892/in-jquery-whats-the-best-way-of-formatting-a-number-to-2-decimal-places) – zero8 Dec 16 '16 at 07:11
  • Possible duplicate of [Formatting a number with exactly two decimals in JavaScript](https://stackoverflow.com/questions/1726630/formatting-a-number-with-exactly-two-decimals-in-javascript) – VLAZ Feb 20 '19 at 14:05
  • Possible duplicate of [Format a number to two decimal places](https://stackoverflow.com/q/4610298/242933) – ma11hew28 Apr 28 '20 at 18:10

31 Answers31

1327
(Math.round(num * 100) / 100).toFixed(2);

Live Demo

var num1 = "1";
document.getElementById('num1').innerHTML = (Math.round(num1 * 100) / 100).toFixed(2);

var num2 = "1.341";
document.getElementById('num2').innerHTML = (Math.round(num2 * 100) / 100).toFixed(2);

var num3 = "1.345";
document.getElementById('num3').innerHTML = (Math.round(num3 * 100) / 100).toFixed(2);
span {
    border: 1px solid #000;
    margin: 5px;
    padding: 5px;
}
<span id="num1"></span>
<span id="num2"></span>
<span id="num3"></span>

Note that it will round to 2 decimal places, so the input 1.346 will return 1.35.

Corey
  • 5,795
  • 4
  • 18
  • 26
drudge
  • 30,947
  • 7
  • 31
  • 41
  • It should work in ALL browsers which is why I think OP did not tell us the real issue. – mplungjan May 26 '11 at 05:47
  • 4
    @OP this doesn't work according the your question, does it? It shows 1.34. You wanted to preserve 1.341, whilst being able to display 1 as 1.00, didn't you? Not that I mind much, but it's strange that you have chosen this answer as being the right one. – KooiInc May 26 '11 at 11:25
  • 9
    @Kooilnc: OP wants `1` to display as `1.00`, and `1.341` to display as `1.34`. – drudge May 26 '11 at 16:59
  • 64
    No need to use round() since toFixed() rounds it. – Milan Babuškov Dec 14 '13 at 21:24
  • 1
    Use this method for precise rounding : http://stackoverflow.com/a/25075575/781695 – user Aug 01 '14 at 08:04
  • 36
    toFixed() does round it but don't forget it's returning a string...So this method is really only useful for display. If you want to perform further mathematical computations on the rounded value do not use toFixed(). – TWright Oct 15 '15 at 07:19
  • 9
    according to MDN, Math.round will not always give accurate results due to rounding errors. I tested this with 1.005, which should round to 1.01, but it gives 1.00. Use my answer for consistent accuracy: http://stackoverflow.com/a/34796988/3549440. – Nate Jan 14 '16 at 18:39
  • 2
    @TWright Yes, this returns a string. You could easily wrap the entire code in another parseFloat which will change it back to a number. – stealthysnacks Feb 13 '17 at 21:45
  • 17
    This entire answer could be reduced to `(+num).toFixed(2)`. It even retains the rounding bug in the original, see [*Nate's answer*](https://stackoverflow.com/questions/6134039/format-number-to-always-show-2-decimal-places/34796988#34796988). – RobG Aug 15 '17 at 04:01
  • 2
    Why are you doing Math.round and parseFloat?? toFixed() alone is enough to achieve the required result. – shinobi Aug 17 '18 at 11:22
  • @stealthysnacks 2 will be converted to integer. But we need a decimal. – Eduard Sep 11 '18 at 08:57
  • @MilanBabuškov not in all cases, suppose you have 4.485 gives you 4.48 but this method gives 4.49 which is correct. You may try. – Harry_pb Jan 15 '19 at 16:38
  • 1
    Do we really need the `parseFloat()`? – user2078023 Feb 12 '19 at 12:58
  • Thank you so much. Saved lot of my time :) – IronmanX46 Apr 12 '19 at 14:01
  • 1
    This does not work `parseFloat(Math.round(-3.4028230607370965e+38 * 100) / 100).toFixed(2);` returns `"-3.4028230607370965e+38"` instead of `0.00` – Ferrybig Apr 17 '19 at 09:36
  • `code` function numberWithCommas(number) { var newval = parseFloat(Math.round(number * 100) / 100).toFixed(2); return newval.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); } – Tsuna Sawada Apr 30 '19 at 08:42
  • I got 00 after this but toFixed only work. Its not working or I am missing something. – Sabri Meviş Sep 04 '20 at 07:11
  • To clarify on the rounding rules. If you are rounding "5", it rounds to the nearest even number. 3.5 to 4.5 would round to 4, for example. This means that rounding 4.485 SHOULD give you 4.48 and not 4.49 - 5 is weird like that, I guess because if you ALWAYS rounded up, rounding a large set of numbers would be much more inaccurate than if half the 5s went up and half went down. – Bardicer Feb 09 '21 at 22:16
372
Number(1).toFixed(2);         // 1.00
Number(1.341).toFixed(2);     // 1.34
Number(1.345).toFixed(2);     // 1.34 NOTE: See andy's comment below.
Number(1.3450001).toFixed(2); // 1.35

document.getElementById('line1').innerHTML = Number(1).toFixed(2);
document.getElementById('line2').innerHTML = Number(1.341).toFixed(2);
document.getElementById('line3').innerHTML = Number(1.345).toFixed(2);
document.getElementById('line4').innerHTML = Number(1.3450001).toFixed(2);
<span id="line1"></span>
<br/>
<span id="line2"></span>
<br/>
<span id="line3"></span>
<br/>
<span id="line4"></span>
Florian
  • 1,767
  • 2
  • 18
  • 41
Abel ANEIROS
  • 4,840
  • 1
  • 21
  • 19
  • 1
    Last line is false. I tried this in Chrome console and ``Number(1.365).toFixed(2) returns "1.37" – Andre Jul 16 '13 at 14:37
  • 1
    @Andre, Chrome 29.0.1547.57 gives me `1.34` for expression `Number(1.345).toFixed(2)`. – Drew Noakes Aug 22 '13 at 22:29
  • 1
    toFixed *does* do rounding, which you can see on almost every test number. – andy Nov 08 '13 at 18:55
  • 51
    Accidentally submitted that last comment before finishing.. `1.345` is an example of a number that can't be stored exactly in floating point, so I think the reason that it doesn't round as you expect, is that it's actually stored as a number slightly less than 1.345 and it rounds down. If you test instead with `(1.34500001).toFixed(2)` then you see it correctly rounds up to `1.35` – andy Nov 08 '13 at 19:02
  • Way late, but to shed some light on the "5" rounding, it always rounds to the nearest even number. 1.345 would round to 1.34, but so would 1.335. Half the time 5 goes up and half the time 5 goes down. – Bardicer Feb 09 '21 at 22:17
113

This answer will fail if value = 1.005.

As a better solution, the rounding problem can be avoided by using numbers represented in exponential notation:

Number(Math.round(1.005+'e2')+'e-2'); // 1.01

Cleaner code as suggested by @Kon, and the original author:

Number(Math.round(parseFloat(value + 'e' + decimalPlaces)) + 'e-' + decimalPlaces)

You may add toFixed() at the end to retain the decimal point e.g: 1.00 but note that it will return as string.

Number(Math.round(parseFloat(value + 'e' + decimalPlaces)) + 'e-' + decimalPlaces).toFixed(decimalPlaces)

Credit: Rounding Decimals in JavaScript

razu
  • 1,488
  • 1
  • 13
  • 19
  • 18
    Amazingly, everyone else in here failed to see that `toFixed` has that rounding problem. Your answer should be the accepted one. – Armfoot Sep 25 '15 at 10:46
  • 1
    Just tested to see if this was still the case. you are still correct for Chrome Version 59.0.3071.115 Your solution will round up for 1.005 (1.01) and round down for 1.00499999 (1.00) – Artistan Jul 19 '17 at 13:26
  • http://jsfiddle.net/Artistan/qq895bnp/28/ there are "times" when toFixed will work, but it is quite inconsistent. :) – Artistan Jul 19 '17 at 17:06
  • surround Number in parseFloat is its returning string – user889030 Sep 26 '17 at 13:55
  • 3
    This is a solid answer. A couple of improvements I can think of: (1) VS Code (TypeScript file) doesn't like Math.round() passing in a string. (2) Make number of decimal places dynamic (not hard-coded to 2). (3) toFixed() seems unnecessary. So what I came up with is `Number(Math.round(parseFloat(value + 'e' + decimalPlaces)) + 'e-' + decimalPlaces)` – Kon Apr 25 '19 at 19:12
  • If you remove `toFixed` you lose the number of decimals. I.e: 0.000 is displayed as 0. – xavier Jul 19 '19 at 08:59
  • When rounding 5, you round to the nearest even number. – Bardicer Feb 09 '21 at 22:20
  • VS code doesn't accept the round function with e in it. alternatively, you can use https://stackoverflow.com/a/53378133/3485836 , both are returning correct o/p – Alok Mar 02 '21 at 12:58
53

For modern browsers, use toLocaleString:

var num = 1.345;
num.toLocaleString(undefined, { maximumFractionDigits: 2, minimumFractionDigits: 2 });

Specify a locale tag as first parameter to control the decimal separator. For a dot, use for example English U.S. locale:

num.toLocaleString("en-US", { maximumFractionDigits: 2, minimumFractionDigits: 2 });

which gives:

1.35

Most countries in Europe use a comma as decimal separator, so if you for example use Swedish/Sweden locale:

num.toLocaleString("sv-SE", { maximumFractionDigits: 2, minimumFractionDigits: 2 });

it will give:

1,35

holmis83
  • 13,750
  • 3
  • 63
  • 75
25
var num = new Number(14.12);
console.log(num.toPrecision(2));//outputs 14
console.log(num.toPrecision(3));//outputs 14.1
console.log(num.toPrecision(4));//outputs 14.12
console.log(num.toPrecision(5));//outputs 14.120
Tiberiu Petcu
  • 715
  • 6
  • 9
  • That gives unexpected results, if your number can be 1.4, and 23.654, and 0, what precision would you take? – shinzou Oct 15 '16 at 15:36
  • 3
    Note the OP is asking for **"rounding where applicable"**. `toPrecision` only formats the number to a specific number of decimal places, simply leaving out redundant places, but **not rounding them**. This could be very useful too of course, but it's important to understand the difference. – Boaz Nov 09 '16 at 11:40
  • 1
    Actually [toPrecision](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toPrecision) does round, according to Mozilla. Test: `(20.55).toPrecision(3) "20.6"` – James L. Nov 27 '17 at 17:20
  • 5
    If you want to [strip trailing zeros](https://stackoverflow.com/questions/3612744/remove-insignificant-trailing-zeros-from-a-number), cast it to a Number or Float after using `toFixed`: `const formattedVal = Number(val.toFixed(2));` Do not use `toPrecision`, as it counts the non-decimal numbers when using the precision param. – James L. Nov 27 '17 at 17:26
22

For the most accurate rounding, create this function:

function round(value, decimals) {
    return Number(Math.round(value +'e'+ decimals) +'e-'+ decimals).toFixed(decimals);
}

and use it to round to 2 decimal places:

console.log("seeked to " + round(1.005, 2));
> 1.01

Thanks to Razu, this article, and MDN's Math.round reference.

Community
  • 1
  • 1
Nate
  • 2,221
  • 3
  • 17
  • 29
13

A much more generic solution for rounding to N places

function roundN(num,n){
  return parseFloat(Math.round(num * Math.pow(10, n)) /Math.pow(10,n)).toFixed(n);
}


console.log(roundN(1,2))
console.log(roundN(1.34,2))
console.log(roundN(1.35,2))
console.log(roundN(1.344,2))
console.log(roundN(1.345,2))
console.log(roundN(1.344,3))
console.log(roundN(1.345,3))
console.log(roundN(1.3444,3))
console.log(roundN(1.3455,3))

Output

1.00
1.34
1.35
1.34
1.35
1.344
1.345
1.344
1.346
PirateApp
  • 4,149
  • 2
  • 34
  • 51
  • 1
    This alswer fails with certain numbers close to 0, `roundN(-3.4028230607370965e+38,2)` returns `"-3.4028230607370965e+38"` instead of the expected 0.00 – Ferrybig Apr 17 '19 at 09:38
  • interesting @Ferrybig i ll test the numbers you mentioned and think of a workaround, thanks for testing – PirateApp Apr 17 '19 at 11:03
  • 1
    Note that the before mentioned number should not show zero, but a huge number instead, this was just an error in my brain. But it still doesn't work, since it still doesn't show 2 decimals – Ferrybig Apr 17 '19 at 11:51
12

Simplest answer:

var num = 1.2353453;
num.toFixed(2); // 1.24

Example: http://jsfiddle.net/E2XU7/

macio.Jun
  • 8,823
  • 1
  • 42
  • 40
10

If you're already using jQuery, you could look at using the jQuery Number Format plugin.

The plugin can return formatted numbers as a string, you can set decimal, and thousands separators, and you can choose the number of decimals to show.

$.number( 123, 2 ); // Returns '123.00'

You can also get jQuery Number Format from GitHub.

Sam Sehnert
  • 2,814
  • 1
  • 18
  • 25
10
var number = 123456.789;


console.log(new Intl.NumberFormat('en-IN', { maximumFractionDigits: 2 }).format(number));

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat

zloctb
  • 8,712
  • 5
  • 60
  • 76
8

Is this what you mean?

function showAsFloat(num, n){
  const numeric = parseFloat(num);
  const divider = Math.pow(10, (n || 1));
  return isNaN(numeric) ? num : (Math.round(numeric * divider)/divider).toFixed(n);
}

document.querySelector('#result').textContent = 
    [
     'command                      | result',
     '-----------------------------------------------',
     'showAsFloat(1);              | ' + showAsFloat(1),
     'showAsFloat(1.314);          | ' + showAsFloat(1.314),
     'showAsFloat(\'notanumber\')    | ' + showAsFloat('notanumber'),
     'showAsFloat(\'23.44567\', 3)   | ' + showAsFloat('23.44567', 3),
     'showAsFloat(2456198, 5)      | ' + showAsFloat('24568', 5),
     'showAsFloat(0);              | ' + showAsFloat(0),
     'showAsFloat(1.345);          | ' + showAsFloat(1.345, 2),
     'showAsFloat(0.005);          | ' + showAsFloat(0.005, 2)
     
    ].join('\n');
<pre id="result"></pre>
KooiInc
  • 104,388
  • 28
  • 131
  • 164
6

Convert a number into a string, keeping only two decimals:

var num = 5.56789;
var n = num.toFixed(2);

The result of n will be:

5.57
Behnam Mohammadi
  • 5,246
  • 35
  • 32
6

Just run into this one of longest thread, below is my solution:

parseFloat(Math.round((parseFloat(num * 100)).toFixed(2)) / 100 ).toFixed(2)

Let me know if anyone can poke a hole

dota2pro
  • 5,432
  • 5
  • 25
  • 52
Sam Johnson
  • 61
  • 1
  • 2
4
function currencyFormat (num) {
    return "$" + num.toFixed(2).replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,")
}

console.info(currencyFormat(2665));   // $2,665.00
console.info(currencyFormat(102665)); // $102,665.00
Ar No
  • 1,373
  • 17
  • 17
4

Are you looking for floor?

var num = 1.42482;
var num2 = 1;
var fnum = Math.floor(num).toFixed(2);
var fnum2 = Math.floor(num2).toFixed(2);
alert(fnum + " and " + fnum2); //both values will be 1.00
samwise
  • 361
  • 3
  • 14
3

Here's also a generic function that can format to any number of decimal places:

function numberFormat(val, decimalPlaces) {

    var multiplier = Math.pow(10, decimalPlaces);
    return (Math.round(val * multiplier) / multiplier).toFixed(decimalPlaces);
}
Minas Mina
  • 1,813
  • 2
  • 18
  • 28
3

Where specific formatting is required, you should write your own routine or use a library function that does what you need. The basic ECMAScript functionality is usually insufficient for displaying formatted numbers.

A thorough explanation of rounding and formatting is here: http://www.merlyn.demon.co.uk/js-round.htm#RiJ

As a general rule, rounding and formatting should only be peformed as a last step before output. Doing so earlier may introduce unexpectedly large errors and destroy the formatting.

RobG
  • 124,520
  • 28
  • 153
  • 188
  • There are times when I shake my head at my own choice to get so deeply involved of late in this whole JS/Ecma platform. :( "Where specific formatting is required, you should write your own routine or use a library function that does what you need. The basic ECMAScript functionality is usually insufficient for displaying formatted numbers." What an asinine statement - not that you made it, but because that fact exists. Just sad. Get on the ball, Javascript! :) – ChrisH Dec 21 '17 at 01:41
2

function number_format(string,decimals=2,decimal=',',thousands='.',pre='R$ ',pos=' Reais'){
  var numbers = string.toString().match(/\d+/g).join([]);
  numbers = numbers.padStart(decimals+1, "0");
  var splitNumbers = numbers.split("").reverse();
  var mask = '';
  splitNumbers.forEach(function(d,i){
    if (i == decimals) { mask = decimal + mask; }
    if (i>(decimals+1) && ((i-2)%(decimals+1))==0) { mask = thousands + mask; }
    mask = d + mask;
  });
  return pre + mask + pos;
}
var element = document.getElementById("format");
var money= number_format("10987654321",2,',','.');
element.innerHTML = money;
#format{
display:inline-block;
padding:10px;
border:1px solid #ddd;
background:#f5f5f5;
}
<div id='format'>Test 123456789</div>
Leonardo Filipe
  • 761
  • 7
  • 6
2

here is another solution to round only using floor, meaning, making sure calculated amount won't be bigger than the original amount (sometimes needed for transactions):

Math.floor(num* 100 )/100;
RopAli Munshi
  • 1,780
  • 3
  • 17
  • 30
Naty
  • 525
  • 5
  • 6
2

Try below code:

function numberWithCommas(number) { 

   var newval = parseFloat(Math.round(number * 100) / 100).toFixed(2);

   return newval.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
Nayana_Das
  • 1,712
  • 4
  • 21
  • 42
Tsuna Sawada
  • 311
  • 1
  • 2
  • 13
1
var quantity = 12;

var import1 = 12.55;

var total = quantity * import1;

var answer = parseFloat(total).toFixed(2);

document.write(answer);
Allan Pereira
  • 2,551
  • 4
  • 18
  • 26
Darshak Shekhda
  • 636
  • 5
  • 7
1

I had to decide between the parseFloat() and Number() conversions before I could make toFixed() call. Here's an example of a number formatting post-capturing user input.

HTML:

<input type="number" class="dec-number" min="0" step="0.01" />

Event handler:

$('.dec-number').on('change', function () {
     const value = $(this).val();
     $(this).val(value.toFixed(2));
});

The above code will result in TypeError exception. Note that although the html input type is "number", the user input is actually a "string" data type. However, toFixed() function may only be invoked on an object that is a Number.

My final code would look as follows:

$('.dec-number').on('change', function () {
     const value = Number($(this).val());
     $(this).val(value.toFixed(2));
});

The reason I favor to cast with Number() vs. parseFloat() is because I don't have to perform an extra validation neither for an empty input string, nor NaN value. The Number() function would automatically handle an empty string and covert it to zero.

vitek
  • 11
  • 2
1

var num1 = "0.1";
document.getElementById('num1').innerHTML = (Math.round(num1 * 100) / 100).toFixed(2);

var num2 = "1.341";
document.getElementById('num2').innerHTML = (Math.round(num2 * 100) / 100).toFixed(2);

var num3 = "1.345";
document.getElementById('num3').innerHTML = (Math.round(num3 * 100) / 100).toFixed(2);
span {
    border: 1px solid #000;
    margin: 5px;
    padding: 5px;
}
<span id="num1"></span>
<span id="num2"></span>
<span id="num3"></span>
ksav
  • 13,381
  • 5
  • 27
  • 51
  • 3
    This piece of code is enough to achieve your requirement `parseFloat(num.toFixed(2))` – kva Feb 26 '20 at 10:45
1

You are not giving us the whole picture.

javascript:alert(parseFloat(1).toFixed(2)) shows 1.00 in my browsers when I paste it int0 the location bar. However if you do something to it afterwards, it will revert.

var num = 2
document.getElementById('spanId').innerHTML=(parseFloat(num).toFixed(2)-1)


shows 1 and not 1.00
mplungjan
  • 134,906
  • 25
  • 152
  • 209
1

RegExp - alternative approach

On input you have string (because you use parse) so we can get result by using only string manipulations and integer number calculations

let toFix2 = (n) => n.replace(/(-?)(\d+)\.(\d\d)(\d+)/, (_,s,i,d,r)=> {
  let k= (+r[0]>=5)+ +d - (r==5 && s=='-');
  return s + (+i+(k>99)) + "." + ((k>99)?"00":(k>9?k:"0"+k));
})


// TESTs

console.log(toFix2("1"));
console.log(toFix2("1.341"));
console.log(toFix2("1.345"));
console.log(toFix2("1.005"));

Explanation

  • s is sign, i is integer part, d are first two digits after dot, r are other digits (we use r[0] value to calc rounding)
  • k contains information about last two digits (represented as integer number)
  • if r[0] is >=5 then we add 1 to d - but in case when we have minus number (s=='-') and r is exact equal to 5 then in this case we substract 1 (for compatibility reasons - in same way Math.round works for minus numbers e.g Math.round(-1.5)==-1)
  • after that if last two digits k are greater than 99 then we add one to integer part i
Kamil Kiełczewski
  • 53,729
  • 20
  • 259
  • 241
0

I do like:

var num = 12.749;
parseFloat((Math.round(num * 100) / 100).toFixed(2)); // 123.75

Round the number with 2 decimal points, then make sure to parse it with parseFloat() to return Number, not String unless you don't care if it is String or Number.

Yuichi
  • 467
  • 8
  • 20
  • I guess if the purpose was to display with 2 decimals precision, parsing the float will mess with that. E.g. `parseFloat("1.00") // 1` – Stijn de Witt Aug 01 '17 at 20:21
0

Extend Math object with precision method

Object.defineProperty(Math, 'precision',{
   value: function (value,precision,type){
             var v = parseFloat(value),
                 p = Math.max(precision,0)||0,
                 t = type||'round';
              return (Math[t](v*Math.pow(10,p))/Math.pow(10,p)).toFixed(p);
          }
    });

console.log(
    Math.precision(3.1,3), // round 3 digits 
    Math.precision(0.12345,2,'ceil'), // ceil 2 digits
    Math.precision(1.1) // integer part
)
bortunac
  • 3,930
  • 1
  • 26
  • 19
-1

parseInt(number * 100) / 100; worked for me.

Be Wake Pandey
  • 417
  • 1
  • 4
  • 11
-1

You can try this code:

    function FormatNumber(number, numberOfDigits = 2) {
        try {
            return new Intl.NumberFormat('en-US').format(parseFloat(number).toFixed(numberOfDigits));
        } catch (error) {
            return 0;
        }
    }

    var test1 = FormatNumber('1000000.4444');
    alert(test1); // 1,000,000.44

    var test2 = FormatNumber(100000000000.55555555, 4);
    alert(test2); // 100,000,000,000.5556
MRoeling
  • 78
  • 9
VnDevil
  • 1,012
  • 12
  • 12
-3
(num + "").replace(/^([0-9]*)(\.[0-9]{1,2})?.*$/,"$1$2")
Crow Soup
  • 5
  • 2
-3

This is how I solve my problem:

parseFloat(parseFloat(floatString).toFixed(2));
Liam
  • 22,818
  • 25
  • 93
  • 157
Alex T
  • 27
  • 4