My question is: Whether the number is rounded when necessary. As in the code below, I would convert the number: 0.075. I think rounding 0.075 should be 0.08 as "5 go up". However, it looks weird in the first case below. So I was confused.
var a=0.25*0.3; var res1 = a.toFixed(2); console.log(res1); //Output: a is 0.07 (Is there something wrong?) var b=0.025*3; var res2= b.toFixed(2); console.log(res2); //Output?b is 0.08
As stated in the docs,
toFixed() does round when necessary. The rounding behavior is to round in the range -.5 < x <= +.5 of the digit.
The strange behavior you're observing is consistent with the note in the docs linked above:
Floating point numbers cannot represent all decimals precisely in binary which can lead to unexpected results such as 0.1 + 0.2 === 0.3 returning false .
In other words, this is a classic case of floating point precision loss - a problem you'll encounter in virtually any language. If you observe the full outputs of
b you'll see that
a == 0.075 and
b == 0.07500000000000001 due to floating point precision - and thus given these values it is consistent with the defined rounding behavior to round
Both these arithmetic calculations have the same result – 0.075:
This is using the decimal number system commonly used.
Computers, at their core, however, don't use the decimal system, but binary – everything is based on 0 and 1.
You can now see why
toFixed returns different results:
©2020 All rights reserved.