我知道javascript中的 toFixed()方法将数字转换为字符串,并保留指定的小数位数,就像下面显示的代码一样,该代码设置了小数点后的位数小数点为 2 。
我的问题是:数字是否在必要时进行四舍五入。如下面的代码所示,我将转换数字: 0.075 。我认为四舍五入0.075应该是0.08,因为“ 5 go up”。但是,在下面的第一种情况下看起来很奇怪。所以我很困惑。
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
我知道可以使用Math.js解决此问题。但是,我只是想知道问题的原因?是toFixed()方法的问题还是javascript中的数据类型的问题。
答案 0 :(得分:1)
如the docs中所述, 您观察到的奇怪行为与上面链接的文档中的注释一致: 浮点数不能精确地用二进制表示所有小数,这会导致意外结果,例如0.1 + 0.2 === 0.3返回false。 换句话说,这是浮点精度损失的经典情况-几乎所有语言都将遇到这个问题。如果您观察到toFixed()
在必要时进行取整。舍入行为是在数字的-.5
a
和b
的完整输出,则由于浮点精度,您会看到a == 0.075
和b == 0.07500000000000001
-因此给定这些值,它与定义了将a
舍入到.07
并将b
舍入到.08
的舍入行为。
答案 1 :(得分:1)
您遇到的问题不是特定于JavaScript的,而是通常在计算中常见的问题。
这两个算术运算的结果相同– 0.075:
这是常用的十进制系统。
但是,计算机的核心不是使用十进制,而是二进制–一切都基于0和1。
因此,他们实际上很难使计算正确无误。 JavaScript和其他编程语言必须对结果进行近似,从而为您提供:
您现在可以了解为什么toFixed
返回不同结果的原因: