C# 中的数字数据类型比较

Numeric data types comparison in C#

能否请您解释以下代码的结果:

    float f = 1.56898138E+09f;
    double d = 1.56898138E+09;
    int i = 1568981320;

    bool a = f > i; //false 
    bool b = d > i; //true
    bool c = (int)f > i; //true

为什么是a == false

存在从 int 到 float 的隐式转换。这是有损隐式转换的罕见示例。

(float)1568981320 = 1568981376f,与f相同的值,所以没有更大或更小。

嗯,int使用所有32位来存储整数值

 1568981320 == 1011101100001001100000101001000 (binary)

float 使用 23 位时 只有 并且第一个总是 1 (https://en.wikipedia.org/wiki/Single-precision_floating-point_format),所以 最初的 1011101100001001100000101001000 应该是 rounded:

 1011101100001001100000101001000
                         ^ 
 ^                       from this on we should throw the "1001000" bits away
 |   
 this 1 can be skipped since float assumes that the 1st bit is always 1 

所以在四舍五入时我们应该丢掉 1001000 并添加 1:

 1011101100001001100000101001000 - original value (1568981320)

 1011101100001001100000110000000 -  rounded value (1568981376)
  ^                     ^
  will be stored in float   

这是 1568981376 值,比原来的 1568981320