Day: January 19, 2018

Java: 精确数字运算, 加减乘除运算, 解决浮点数的计算失去精度问题, BigDecimal的用法(加减乘除)

今天在数值计算时碰到一个问题.程序如下: double a = (3.3-2.4)/0.1; System.out.println(a); 你可能认为结果很简单,不就是9嘛,是事实上,结果为:8.999999998,为什么呢?我翻阅了一些资料,终于找出了原因. 为什么浮点数会丢失精度?   十进制数的二进制表示可能不够精确浮点数或是双精度浮点数无法精确表示的情况并不少见。浮点数值没办法用十进制来精确表示的原因要归咎于CPU表示浮点数的方法。这样的话您就可能会牺牲一些精度,有些浮点数运算也会引入误差。以上面提到的情况为例,2.4的二进制表示并非就是精确的2.4。反而最为接近的二进制表示是 2.3999999999999999。原因在于浮点数由两部分组成:指数和尾数。浮点数的值实际上是由一个特定的数学公式计算得到的。您所遇到的精度损失会在任何操作系统和编程环境中遇到。 注意: 您可以使用Binary Coded Decimal (BCD)库来保持精度。BCD数字编码方法会把每一个十进制数字位单独编码。 类型失配 您可能混合了浮点数和双精度浮点数类型。请确定您在进行数学运算的时候所有的数据类型全部相同。 注意:float类型的变量只有7位的精度,而double类型的变量有15位的精度。… Read More “Java: 精确数字运算, 加减乘除运算, 解决浮点数的计算失去精度问题, BigDecimal的用法(加减乘除)”