请考虑以下代码:
0.1 + 0.2 == 0.3 -> false
Run Code Online (Sandbox Code Playgroud)
0.1 + 0.2 -> 0.30000000000000004
Run Code Online (Sandbox Code Playgroud)
为什么会出现这些不准确之处?
$a = '35';
$b = '-34.99';
echo ($a + $b);
Run Code Online (Sandbox Code Playgroud)
结果在0.009999999999998
怎么了?我想知道为什么我的程序会报告奇怪的结果.
为什么PHP没有返回预期的0.01?
考虑以下:
var x = 2.175;
console.log(x.toFixed(2)); // 2.17
Run Code Online (Sandbox Code Playgroud)
什么?不,这并不奇怪.这是相当明显的,请参阅:数字文字2.175实际上存储在内存中(通过IEEE-754规则)作为一个稍微小于2.175的值.这很容易证明:
console.log(x.toFixed(20)); // 2.17499999999999982236
Run Code Online (Sandbox Code Playgroud)
这就是它在32位Windows设置的最新版Firefox,Chrome和Opera中的工作原理.但那不是问题.
真正的问题是Internet Explorer 6(!)实际上是如何设法完成的对 像人类一样:
var x = 2.175;
console.log(x.toFixed(2)); // 2.18
console.log(x.toFixed(20)); // 2.17500000000000000000
Run Code Online (Sandbox Code Playgroud)
好吧,我过度使用了:实际上我测试过的所有Internet Explorer(IE8-11,甚至是MS Edge!)的行为方式都是一样的.还是,WAT?
更新:它变得陌生:
x=1.0;while((x-=0.1) > 0) console.log(x.toFixed(20));
IE Chrome
0.90000000000000000000 0.90000000000000002220
0.80000000000000000000 0.80000000000000004441
0.70000000000000010000 0.70000000000000006661
0.60000000000000010000 0.60000000000000008882
0.50000000000000010000 0.50000000000000011102
0.40000000000000013000 0.40000000000000013323
0.30000000000000015000 0.30000000000000015543
0.20000000000000015000 0.20000000000000014988
0.10000000000000014000 0.10000000000000014433
0.00000000000000013878 0.00000000000000013878
Run Code Online (Sandbox Code Playgroud)
为什么差异 - 除了最后一个?为什么最后一个没有区别?x=0.1; while(x-=0.01)...顺便说一下,它非常相似:直到我们非常接近零,toFixed在IE中显然试图削减一些角落.
免责声明:我不知道,浮点数学是有点缺陷.我不明白的是IE和浏览器世界其他部分之间的区别.
大多数浮点数都没有精确存储(使用IEEE-754格式时),这是一种常见的知识.所以不应该这样做:
0.3 - 0.2 === 0.1; // very wrong
Run Code Online (Sandbox Code Playgroud)
......因为它会导致false,除非使用一些特定的任意精度的类型/类(BigDecimal的中的Java/Ruby的,bcmath时在PHP中,数学:: BigInt有/数学:: BigFloat在Perl,仅举几例)来代替.
但我想知道为什么当一个人尝试打印这个表达式的结果时0.3 - 0.2,脚本语言(Perl和PHP)给出了0.1,但是"虚拟机"(Java,JavaScript和Erlang)提供了更类似的东西0.09999999999999998呢?
为什么它在Ruby中也不一致?版本1.8.6(键盘)给出0.1,版本1.9.3(ideone)给出了0.0999...
执行以下代码时:
public class FPoint {
public static void main(String[] args) {
float f = 0.1f;
for(int i = 0; i<9; i++) {
f += 0.1f;
}
System.out.println(f);
}
}
Run Code Online (Sandbox Code Playgroud)
将显示以下输出:
1.0000001
但输出应该是1.0000000,对吗?如我错了请纠正我..!!