为什么这是真的?

fab*_*ioM 10 c++ java floating-point

这是IEEE 754标准问题.我不完全理解它背后的机制.

public class Gray {  
    public static void main(String[] args){
        System.out.println( (float) (2000000000) == (float) (2000000000 + 50));
    }
}
Run Code Online (Sandbox Code Playgroud)

In *_*ico 29

因为a float只能容纳7到8位有效数字.也就是说,它没有足够的位来准确表示数字2000000050,所以它被舍入到2000000000.

具体来说,一个float由三部分组成:

  • 符号位(1位)
  • 指数(8位)
  • 有效数字(24位,但只存储23位,因为有效数字的MSB始终为1)

您可以将浮点视为计算机进行科学记数法的方式,而不是二进制.

的精度等于log(2 ^ number of significand bits).这意味着一个float可以保持log(2 ^ 24) = 7.225有效数字.

该数字2,000,000,050有9位有效数字.上面的计算告诉我们24位有效数字不能保存那么多有效数字.之所以2,000,000,000是因为只有1个有效数字,所以它适用于有效数字.

要解决这个问题,你可以使用a,double因为它有一个52位有效数字,这足以代表每个可能的32位数字.