Jok*_*ker 5 java double bytecode
可能重复:
在java中保留双精度的精度
你知道Java中这两个操作之间的区别吗?
final double m1 = 11d / 1e9; // gives 1.1e-8
final double m2 = 11d * 1e-9; // gives 1.1000000000000001e-8
Run Code Online (Sandbox Code Playgroud)
我在生成的字节码中看到m2的预编译结果已经不是我的预期.
在输出中javap -verbose -c我可以看到以下值:
const #3 = double 1.1E-8d;
[...]
const #6 = double 1.1000000000000001E-8d;
Run Code Online (Sandbox Code Playgroud)
当我在其他表达式中使用m1或m2时,我没有相同的结果.
当我在C中尝试相同的事情时,m1和m2严格地是1.1e-8
我认为我的问题在于java处理双精度计算的方式,但我无法解释自己错过了什么.
区别在于 1e9 可以精确表示,而 1e-9 则不能完全表示。您可以看到,一个小的表示错误会导致算术错误。
System.out.println(new BigDecimal(1e9));
System.out.println(new BigDecimal(1e-9));
Run Code Online (Sandbox Code Playgroud)
印刷
1000000000
1.0000000000000000622815914577798564188970686927859787829220294952392578125E-9
Run Code Online (Sandbox Code Playgroud)
区别不在于您是否使用了*或/,而在于您在一种情况下使用了整数,在另一种情况下使用了分数。
System.out.println(11 * 1e9);
System.out.println(11 * 1e-9);
Run Code Online (Sandbox Code Playgroud)
印刷
1.1E10
1.1000000000000001E-8
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2772 次 |
| 最近记录: |