【问题标题】:-= 0.1 strange result [duplicate]-= 0.1 奇怪的结果 [重复]
【发布时间】:2011-08-04 19:05:07
【问题描述】:
可能重复:
Is double Multiplication Broken in .NET?
JavaScript 代码:
var n = 1;
while ( n > 0 )
{
n -= 0.1;
document.body.innerHTML += n + "<br/>";
}
http://jsfiddle.net/UpUE6/4/
我预计:
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
但是得到了这个:
0.9
0.8
0.7000000000000001
0.6000000000000001
0.5000000000000001
0.40000000000000013
0.30000000000000016
0.20000000000000015
0.10000000000000014
1.3877787807814457e-16
-0.09999999999999987
谁能解释那里发生了什么?
【问题讨论】:
标签:
javascript
floating-point
【解决方案2】:
并非所有数字都可以精确表示,即使它们有一个简单的十进制表示法。这是因为 JavaScript 使用 IEEE 754 来表示浮点值,因此使用基数 2 而不是基数 10。这导致您实际上并没有减去 0.1(即使您的源代码是这样说的),而是一些接近它的值。
【解决方案3】:
您正在处理一个浮点数。查看 toFixed 和 toPrecision 方法。
【解决方案4】:
这会解决你的问题
http://jsfiddle.net/AVPNx/
var n = 1;
while ( n > 0 ){
n -= 0.1;
result = n.toFixed(1);
document.body.innerHTML += result + "<br/>";
}
【解决方案5】:
来自The Floating-Point Guide:
为什么我的数字,比如 0.1 + 0.2 加起来不是很好的 0.3,而且
相反,我得到了一个奇怪的结果,比如
0.30000000000000004?
因为在内部,计算机使用
格式(二进制浮点)
不能准确地表示一个数字
像 0.1、0.2 或 0.3 一样。
当代码被编译或
解释,你的“0.1”已经
四舍五入到最接近的数字
格式,这会导致一个小
舍入误差甚至在
计算发生。