Bay*_*naa -4 javascript math floating-point
我使用了javascripts eval函数.但我不喜欢结果.如何解决这个问题?
表达:
的eval(1.2 + 24-25)
结果:
0.1999999999999993
我想要0.2结果.
Den*_*ret 10
您遇到的问题是0.2
,与"大多数数字"一样,在IEEE754中没有精确的表示,只要您在计算中合并数字,就会出现问题.你有类似的问题0.2+1-1
.
例如,要获得正确的表示,您可以在转换回数字之前减少到固定的十进制表示
var v = +(1.2+24-25).toFixed(10)
Run Code Online (Sandbox Code Playgroud)
这产生了
0.2
Run Code Online (Sandbox Code Playgroud)
通常的做法是使用数字进行所有计算而不进行舍入或使用,toFixed
并且在将结果呈现给用户时仅使用这种转换(然后这+
不是真正有用).
首先,这里没有任何理由eval
.只是:
1.2 + 24 - 25
Run Code Online (Sandbox Code Playgroud)
会做你想做的.
这里的问题是JavaScript(和其他语言)使用的IEEE-754双精度浮点数并不完全准确.它们非常快,但并不完全准确.
更有名的例子是:
0.1 + 0.2
Run Code Online (Sandbox Code Playgroud)
......给你的0.30000000000000004
.
如果您正在进行财务计算或类似的工作,您需要的结果与使用铅笔和纸张的结果相同,那么您将需要一个能够实现这种风格的库(这将会更慢,但不是遇到上述问题,将会遇到您更熟悉的问题,例如无法1 / 3
完全准确地表示.这个问题及其在Stack Overflow上的答案讨论了各种库选项.