java中float/double浮点数的计算失去精度问题

 现在我们的程序中,时常会用到金额以及其他数据的计算,但往往计算结果和我们预计的会出现差异。比如:		
double a = 0.7;
double b = 0.11;
System.out.println(a+b);
预计的结果是:0.81
实际的过结果是:0.8099999999999999
至于原因,大学老师提到过一些,但是从感觉模糊,这里我就网上找了一篇简单阐述一下:
原文链接:http://hxraid.javaeye.com/blog/504293
 

为什么浮点数会丢失精度?   十进制数的二进制表示可能不够精确

浮点数或是双精度浮点数无法精确表示的情况并不少见。浮点数值没办法用十进制来精确表示的原因要归咎于CPU表示浮点数的方法。这样的话您就可能会牺牲一些精度,有些浮点数运算也会引入误差。以上面提到的情况为例,8.1的二进制表示并非就是精确的8.1。反而最为接近的二进制表示是 0.8099999999999999。原因在于浮点数由两部分组成:指数和尾数。浮点数的值实际上是由一个特定的数学公式计算得到的。您所遇到的精度损失会在任何操作系统和编程环境中遇到。 注意: 您可以使用Binary Coded Decimal (BCD)库来保持精度。BCD数字编码方法会把每一个十进制数字位单独编码。   类型失配 您可能混合了浮点数和双精度浮点数类型。请确定您在进行数学运算的时候所有的数据类型全部相同。 注意:float类型的变量只有7位的精度,而double类型的变量有15位的精度。  如何进行浮点数精度计算?                    Java中的简单浮点数类型float和double不能够进行运算。不光是Java,在其它很多编程语言中也有这样的问题。在大多数情况下,计算的结果是准确的,但是多试几次(可以做一个循环)就可以试出类似上面的错误。现在终于理解为什么要有BCD码了。 这个问题相当严重,如果你有9.999999999999元,你的计算机是不会认为你可以购买10元的商品的。 在有的编程语言中提供了专门的货币类型来处理这种情况,但是Java没有。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值