A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 波涛 中级黑马   /  2014-5-17 13:29  /  8211 人查看  /  48 人回复  /   2 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 波涛 于 2014-5-18 12:24 编辑
  1. public class MathTest{
  2.         public static void main(String[]args){
  3.           double a = 0.01, b = 0.09;
  4.                 System.out.print(a+b);
  5.         }
  6. }
复制代码


打印的结果为什么是0.09999999999999999而非0.1呢?
我想知道为什么以及double最终是怎么个运算法则?我想精确计算怎么办?

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1 赞一个!勤于思考!

查看全部评分

48 个回复

倒序浏览
...居然纠结这个。隐约记得是为虚拟机在不同的机器上计算精度的问题,虚拟机的设计者允许结果扩展精度。解决办法,加上一个strictfp在方法前面就可以。
如: public strictf static void main(String[] args){
               //代码
       }
回复 使用道具 举报
我晕,上面打错一个字了 。
strictfp
回复 使用道具 举报
哈哈我也菜鸟不知道什么原因,但是1.01加上1.09 就没事
回复 使用道具 举报
chang清 发表于 2014-5-17 13:57
...居然纠结这个。隐约记得是为虚拟机在不同的机器上计算精度的问题,虚拟机的设计者允许结果扩展精度。解 ...

我在main方法前加了strictfp关键字,编译通过了,但运行还是那个结果,没变啊~?大神!
回复 使用道具 举报
浮点数运算会损失精度,因为0.01和0.09转换成二进制时会损失一点小数位,如果你用0.05+0.05就是0.01。0.05转化成二进制不损失精度。建议参考计算机组成原理。
回复 使用道具 举报
波涛 发表于 2014-5-17 14:24
我在main方法前加了strictfp关键字,编译通过了,但运行还是那个结果,没变啊~?大神! ...

这个……我没有试过,核心技术上说的是strictfp能得到理想的运算结果。
回复 使用道具 举报
本帖最后由 zy524488 于 2014-5-17 17:05 编辑

其实无论是double还是float都会遇到这个问题,就拿float说话,float的0.1二进制形式是001111011 10011001100110011001101,根据符号位换算为10进制表达的值精确应该是这样计算 110011001100110011001101乘以2的负27次方,实际值是0.100000001490116119384765625
这样就产生了实际误差,

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1 很给力!

查看全部评分

回复 使用道具 举报
论坛中以前有人提过这个问题,不过还是回答一下吧。
java中double 等数据类型精度是个比较恶搞的。在Effective Java中提到,float和double只能用作科学计算或者工程计算,在普通的商业计算,即精算精度要求很高的情况下和计算是否相等的情况下,咱们应该使用的是BigDecimal.使用这个来包装Double对象,这样计算出来的是准确的。使用BigDecimal来就素那加载乘除,算完之后一般使用String输出,另外,如果只是为了单纯的保留几位小数的问题,可以考虑使用DecimalFormat。
希望能够帮到你
回复 使用道具 举报 5 0
学习。。。。。。。。。。。。。。。。。
回复 使用道具 举报
学习一下
回复 使用道具 举报
学习一下咯、、、、、、、、、、、、、、、、、
回复 使用道具 举报
学习了学习了
回复 使用道具 举报
学到了。。。
回复 使用道具 举报
还真没注意过这么个小问题,长知识了。
回复 使用道具 举报
组成原理 内伤啊~
回复 使用道具 举报
肯定是不会等于一的啦。。。。因为这里有精度损失的问题。。。。你了解一下double在计算机里是怎么存储的就知道为什么了。。
回复 使用道具 举报
学习一下
回复 使用道具 举报
http://zhaow-381002134.iteye.com/blog/420369看看这里
回复 使用道具 举报
第一次知道还有这个问题,受教了
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 加入黑马