相关疑难解决方法(0)

浮点数学是否破碎?

请考虑以下代码:

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)

为什么会出现这些不准确之处?

language-agnostic math floating-point floating-accuracy

2798
推荐指数
28
解决办法
28万
查看次数

PHP - 浮点数精度

$a = '35';
$b = '-34.99';
echo ($a + $b);
Run Code Online (Sandbox Code Playgroud)

结果在0.009999999999998

怎么了?我想知道为什么我的程序会报告奇怪的结果.

为什么PHP没有返回预期的0.01?

php floating-point precision floating-accuracy

77
推荐指数
4
解决办法
4万
查看次数

Number.prototype.toFixed:在Internet Explorer中非常正确

考虑以下:

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和浏览器世界其他部分之间的区别.

javascript floating-point internet-explorer

20
推荐指数
2
解决办法
2633
查看次数

为什么浮点数打印得如此不同?

大多数浮点数都没有精确存储(使用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,脚本语言(PerlPHP)给出了0.1,但是"虚拟机"(Java,JavaScriptErlang)提供了更类似的东西0.09999999999999998呢?

为什么它在Ruby中也不一致?版本1.8.6(键盘)给出0.1,版本1.9.3(ideone)给出了0.0999...

javascript php ruby floating-point ieee-754

12
推荐指数
2
解决办法
1163
查看次数

浮点加法 - 给出奇怪的结果..!

执行以下代码时:

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,对吗?如我错了请纠正我..!!

java floating-point floating-accuracy

1
推荐指数
1
解决办法
1060
查看次数