C# C语言中的数字数据类型比较#
请您解释一下以下代码的结果:C# C语言中的数字数据类型比较#,c#,floating-point,comparison-operators,C#,Floating Point,Comparison Operators,请您解释一下以下代码的结果: 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的隐式转换。这是一个罕见的有损隐式转换示例 (flo
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
(),所以
首字母10111011000011000001001000
应四舍五入:
因此,当四舍五入时,我们应该扔掉1001000
并添加1
:
1011101100001001100000101001000 - original value (1568981320)
1011101100001001100000110000000 - rounded value (1568981376)
^ ^
will be stored in float
这是
1568981376
的值,它比原来的1568981320
大。float是一个32位浮点数,double是一个64位浮点数,int是一个32位整数。因为float
不够精确,无法表示1568981320
。当1568981320
转换为float
时,结果是1568981380
,因此f==i
(int
隐式提升为float
,而不是相反)<顺便说一句,code>double足够精确,可以准确地表示所有可能的int
值。
1011101100001001100000101001000 - original value (1568981320)
1011101100001001100000110000000 - rounded value (1568981376)
^ ^
will be stored in float