`

浮点数计算

 
阅读更多

 

@Test

public void test2() throws Exception {

System.out.println( 0.05 + 0.01 );

System.out.println( 1.0 - 0.42 );

System.out.println( 4.015 * 100 );

System.out.println( 123.3 / 100 );

System.out.println( ( 1.2 - 0.3 ) == 0.9 );

System.out.println(0.2 + 0.1);

        System.out.println(0.3 - 0.1);

        System.out.println(0.2 * 0.1);

        System.out.println(0.3 / 0.1);

System.out.println( 0.20 + 0.4 );

}

 

结果

0.060000000000000005

0.5800000000000001

401.49999999999994

1.2329999999999999

false

0.30000000000000004

0.19999999999999998

0.020000000000000004

2.9999999999999996

0.6000000000000001

 

 

原因

 

我们的计算机在存储小数时肯定是有长度限制的,所以会进行截取部分小数进行存储,从而导致计算机存储的数值只能是个大概的值,而不是精确的值。从这里看出来我们的计算机根本就无法使用二进制来精确的表示 2.1 这个十进制数字的值,连表示都无法精确表示出来,计算肯定是会出现问题的。

 

现有有三种办法

  1. 如果业务不是必须非常精确的要求可以采取四舍五入的方法来忽略这个问题。
  2. 转成整型再进行计算。
  3. 使用 BCD 码存储和运算二进制小数(感兴趣的同学可自行搜索学习)。

一般每种语言都用高精度运算的解决方法(比一般运算耗费性能),比如 Python 的 decimal 模块,Java 的 BigDecimal

 

 

 

 

 

 

<audio controls="controls" style="display: none;"></audio>

<audio controls="controls" style="display: none;"></audio>

<audio controls="controls" style="display: none;"></audio>

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics