java 整数与单/双浮点数的除法运算结果,为什么会是这样

网上找了高人自已写的加程除法運算,但好像运算多了还是会有问题.

   //动态控制精度长度

}

今天在数值计算时碰到一个问题.程序如下:
你可能认为结果很简单,不就是9嘛,是事实上,结果为:8.,为什么呢?我翻阅了一些资料,终于找出了原因.
十进制数的二进制表示可能不够精确

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

}

1、float整数计算误差

案例:会员积分芓段采用float类型导致计算会员积分时,7位整数的数据计算结果出现误差

原因:超出float精度范围,无法精确计算

float和double的精度是由尾数的位数來决定的。浮点数在内存中是按科学计数法来存储的其整数部分始终是一个隐含着的“1”,由于它是不变的故不能对精度造成影响。

float:2^23 = 8388608一共七位,这意味着最多能有7位有效数字但绝对能保证的为6位,也即float的精度为6~7位有效数字;

难道只是位数多大的问题字段类型换荿double就可以解决吗?对于本案例是这样因为都是整数计算,但如果有小数位就不一定了,见下面案例

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信