Javascript toFixed() 方法中的舍入

s66*_*666 5 javascript decimal rounding

我知道javascript中的toFixed()方法将数字转换为字符串,保留指定的小数位数,就像下面所示的代码,它将小数点后的位数设置为2

\n\n

我的问题是:必要时是否对数字进行四舍五入。如下面的代码所示,我将转换数字:0.075。我认为 0.075 舍入应该是 0.08,因为“5 向上”。然而,在下面的第一种情况下看起来很奇怪。所以我很困惑。

\n\n

\r\n
\r\n
var a=0.25*0.3;\r\nvar res1 = a.toFixed(2);\r\nconsole.log(res1);\r\n//Output: a is 0.07 (Is there something wrong?)\r\n\r\nvar b=0.025*3;\r\nvar res2= b.toFixed(2);\r\nconsole.log(res2);\r\n//Output\xef\xbc\x9ab is 0.08
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n\n

我知道这个问题可以通过使用 Math.js 来解决。然而,我只是想知道问题的原因\xef\xbc\x9f 是 toFixed() 方法的问题还是javascript中数据类型的问题。

\n

Kla*_*con 2

正如文档中所述,必要时toFixed() 会进行舍入。舍入行为是在数字的 -.5 < x <= +.5 范围内舍入。

您观察到的奇怪行为与上面链接的文档中的注释一致:

浮点数无法以二进制精确表示所有小数,这可能会导致意外结果,例如 0.1 + 0.2 === 0.3 返回 false 。

换句话说,这是浮点精度损失的典型案例 - 几乎在任何语言中都会遇到这个问题。如果您观察 的完整输出ab您会看到a == 0.075由于b == 0.07500000000000001浮点精度,因此给定这些值,它与舍入到a.07b的定义舍入行为一致.08