浮点数==比较

System.out.println(0.1d == 0.1f);

结果会是flase

类型升级(type promotion)

首先,来看看java中的几种原生的数值类型进行==或!=比较运算的时候会发生什么。

如果运算符两边的数值类型不同,则首先会进行类型升级(type promotion),规则如下:

  • 如果运算符任意一方的类型为double,则另一方会转换为double
  • 否则,如果运算符任意一方的类型为float,则另一方会转换为float
  • 否则,如果运算符任意一方的类型为long,则另一方会转换为long
  • 否则,两边都会转换为int

 

舍入误差(round-off error)

我们知道,根据IEEE 754,单精度的float是32位,双精度的double为64位,如下图:

 

其中,第一部分(s)为符号位,第二部分(exponent)为指数位,第三部分(mantissa)为基数部分。 这是科学计数法的二进制表示。

那么,既然位数是固定的,要表示像 1/3=0.3333333333333...或者pi=3.1415926..... 这样的无限循环小数,就变得不可能了。

根据规范,则需要将不能标识的部分舍掉。

第二,还与10进制不同的是,二进制对于一些有限的小数,也不能精确的标示。比如像0.1这样的小数,用二进制也无法精确表示。所以,也需要舍掉。

关于0.1无法用二进制精确表示,可以参见文章: http://en.wikipedia.org/wiki/Floating_point

posted @ 2022-10-14 12:12  車輪の唄  阅读(16)  评论(0编辑  收藏  举报  来源