首页 新闻 会员 周边

java浮点型是怎么截去多余位的

0
悬赏园豆:20 [已解决问题] 解决于 2014-05-11 23:32

声明

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是怎么截去多余位的?

mycome的主页 mycome | 初学一级 | 园豆:184
提问于:2014-05-09 10:21
< >
分享
最佳答案
1

Java的浮点数采用IEEE754标准进行编码,一个小数最终由二进制的尾数码和阶码表示,像0.1这样的数是无法用二进制无失真表示的,就好像1/3可以用三进制0.1准确表示,却无法用有限位的10进制表示一样。

当用0.1赋给d1时,实际上d1也是做了舍入的,总而言之double运算通常都不是完全精确的,协调与否其实更多在于打印显示结果的细节上。

收获园豆:20
adanus | 初学一级 |园豆:144 | 2014-05-09 22:46

原来如此

不过我觉得可能和java的编译器和虚拟机也有关系

可能虚拟机做了一些优化,以至于在简单赋值不做运算的情况下可以打印较为常规的结果

mycome | 园豆:184 (初学一级) | 2014-05-11 21:46

@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

adanus | 园豆:144 (初学一级) | 2014-05-11 22:44

链接非常有用

问题比我想象的要复杂

java解决一个问题真是九曲十八弯呀,真要用Java写个大软件,性能得差到什么程度

mycome | 园豆:184 (初学一级) | 2014-05-11 23:30
其他回答(1)
0

这是真的?总觉得不应该的,怎么算都不会有这样的问题.在精度范围内,怎么会出现误差?

吴瑞祥 | 园豆:29449 (高人七级) | 2014-05-09 10:28

跑下来是这个结果,虽然影响不大,但有有一种不协调感

支持(0) 反对(0) mycome | 园豆:184 (初学一级) | 2014-05-09 10:32

@mycome: 定义一个变量接收之后再输出会 不会有这个问题?

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2014-05-09 10:40

double d1 = 0.1;
double d2 = 0.2;
double d4 = d1 + d2;
System.out.println(d4);

结果

0.30000000000000004

 

支持(0) 反对(0) mycome | 园豆:184 (初学一级) | 2014-05-09 11:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册