声明
double d1 = 0.1;
double d2 = 0.2;
double d3 = d1;
System.out.println("" + d1 + "+" + d2 + "=" + (d1 + d2));
System.out.println(d3);
结果
0.1+0.2=0.30000000000000004
0.1
问题
在运算后结果因为浮点数的精度问题不会绝对准确
为什么在赋值的时候不会出现这个问题,java是怎么截去多余位的?
Java的浮点数采用IEEE754标准进行编码,一个小数最终由二进制的尾数码和阶码表示,像0.1这样的数是无法用二进制无失真表示的,就好像1/3可以用三进制0.1准确表示,却无法用有限位的10进制表示一样。
当用0.1赋给d1时,实际上d1也是做了舍入的,总而言之double运算通常都不是完全精确的,协调与否其实更多在于打印显示结果的细节上。
原来如此
不过我觉得可能和java的编译器和虚拟机也有关系
可能虚拟机做了一些优化,以至于在简单赋值不做运算的情况下可以打印较为常规的结果
@mycome: 很有可能,其实system.out.println(double)最终调用的是Double.toString()。另一点就是对于double d1=0.1+0.2;double d2=0.3;d1和d2在内存中值应该是不一样的,毕竟0.1和0.2两个非精确表示数再相加时会有舍入,故虽然d1和d2被打印出来时会被做一些”人性化“打印优化,但结果还是不同。这里有个相关的讨论:http://www.coderanch.com/t/529831/java/java/Double-toString-return-exact
链接非常有用
问题比我想象的要复杂
java解决一个问题真是九曲十八弯呀,真要用Java写个大软件,性能得差到什么程度
这是真的?总觉得不应该的,怎么算都不会有这样的问题.在精度范围内,怎么会出现误差?
跑下来是这个结果,虽然影响不大,但有有一种不协调感
@mycome: 定义一个变量接收之后再输出会 不会有这个问题?
double d1 = 0.1;
double d2 = 0.2;
double d4 = d1 + d2;
System.out.println(d4);
结果
0.30000000000000004