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
大
能否请您解释以下代码的结果:
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