添加浮点数,为什么第一个代码有效
Addition of floating point, Why the First code work
为什么第一个代码中 if()
的主体执行而第二个代码中 if()
的主体不执行
Float are not precise
Working
double num1 = 0.2;
double num2 = 0.2;
double num3 = num1 + num2;
if (num3 == 0.4)
{
MessageBox.Show("1st");
}
Not Working
double num1 = 0.1;
double num2 = 0.2;
double num3 = num1 + num2;
if (num3 == 0.3)
{
MessageBox.Show("2nd");
}
Reason
机器使用二进制语言当它把数字转换成二进制时,再转换回十进制值被改变,由于一些数字不能完全转换成二进制
当您转换 0.1 into base 2 (binary)
时,您会在小数点后得到一个重复模式,
喜欢 1/3 以 10 为基数 ; 1/3=0.333333333333333333333333333333333..........
& 从未获得准确值
因此您无法使用普通的浮点方法获取每个数字的准确值。
Example (Conversion Pattern)
0.1 二进制模式...
Source: Why 0.1 Does Not Exist In Floating-Point
0.1 Conversion 0.1 is one-tenth, or 1/10. To show it in binary
您可以看到 100
在间隔后重复 As 输出为 1001
如图所示
Source: Why 0.1 Does Not Exist In Floating-Point
Second Code Snippets {Answer of 0.1+0.2 Is not Same as actual value of 0.3}
--------------------------------------------------------------
Actual {Answer of 0.1+0.2 Is not Same as actual value of 0.3}
--------------------------------------------------------------
0.1=0.1000000000000000055511151231257827021181583404541015625
0.2=0.200000000000000011102230246251565404236316680908203125
0.3=0.299999999999999988897769753748434595763683319091796875
==============================================================
Calculation 0.1 + 0.2
______________________________________________________________
0.1=0.1000000000000000055511151231257827021181583404541015625
+0.2=0.200000000000000011102230246251565404236316680908203125
--------------------------------------------------------------
0.3=0.3000000000000000444089209850062616169452667236328125
==============================================================
Answer
--------------------------------------------------------------
0.3000000000000000444089209850062616169452667236328125
!=0.299999999999999988897769753748434595763683319091796875
---------------------------------------------------------------
First Code Snippets {Answer of 0.2+0.2 Is Same as actual value of 0.4}
---------------------------------------------------------------
Actual {Answer of 0.2+0.2 Is Same as actual value of 0.4}
---------------------------------------------------------------
0.2=0.200000000000000011102230246251565404236316680908203125
0.2=0.200000000000000011102230246251565404236316680908203125
0.4=0.40000000000000002220446049250313080847263336181640625
==============================================================
Calculation 0.2 + 0.2
---------------------------------------------------------------
0.2=0.200000000000000011102230246251565404236316680908203125
+0.2=0.200000000000000011102230246251565404236316680908203125
---------------------------------------------------------------
0.4=0.40000000000000002220446049250313080847263336181640625
==============================================================
Answer
--------------------------------------------------------------
0.4=0.40000000000000002220446049250313080847263336181640625
==0.4=0.40000000000000002220446049250313080847263336181640625
---------------------------------------------------------------
Source:Is floating point math broken?
为什么第一个代码中 if()
的主体执行而第二个代码中 if()
的主体不执行
Float are not precise
Working
double num1 = 0.2;
double num2 = 0.2;
double num3 = num1 + num2;
if (num3 == 0.4)
{
MessageBox.Show("1st");
}
Not Working
double num1 = 0.1;
double num2 = 0.2;
double num3 = num1 + num2;
if (num3 == 0.3)
{
MessageBox.Show("2nd");
}
Reason
机器使用二进制语言当它把数字转换成二进制时,再转换回十进制值被改变,由于一些数字不能完全转换成二进制
当您转换 0.1 into base 2 (binary)
时,您会在小数点后得到一个重复模式,
喜欢 1/3 以 10 为基数 ; 1/3=0.333333333333333333333333333333333..........
& 从未获得准确值
因此您无法使用普通的浮点方法获取每个数字的准确值。
Example (Conversion Pattern)
0.1 二进制模式...
Source: Why 0.1 Does Not Exist In Floating-Point
0.1 Conversion 0.1 is one-tenth, or 1/10. To show it in binary
您可以看到 100
在间隔后重复 As 输出为 1001
如图所示
Source: Why 0.1 Does Not Exist In Floating-Point
Second Code Snippets {Answer of 0.1+0.2 Is not Same as actual value of 0.3}
--------------------------------------------------------------
Actual {Answer of 0.1+0.2 Is not Same as actual value of 0.3}
--------------------------------------------------------------
0.1=0.1000000000000000055511151231257827021181583404541015625
0.2=0.200000000000000011102230246251565404236316680908203125
0.3=0.299999999999999988897769753748434595763683319091796875
==============================================================
Calculation 0.1 + 0.2
______________________________________________________________
0.1=0.1000000000000000055511151231257827021181583404541015625
+0.2=0.200000000000000011102230246251565404236316680908203125
--------------------------------------------------------------
0.3=0.3000000000000000444089209850062616169452667236328125
==============================================================
Answer
--------------------------------------------------------------
0.3000000000000000444089209850062616169452667236328125
!=0.299999999999999988897769753748434595763683319091796875
---------------------------------------------------------------
First Code Snippets {Answer of 0.2+0.2 Is Same as actual value of 0.4}
---------------------------------------------------------------
Actual {Answer of 0.2+0.2 Is Same as actual value of 0.4}
---------------------------------------------------------------
0.2=0.200000000000000011102230246251565404236316680908203125
0.2=0.200000000000000011102230246251565404236316680908203125
0.4=0.40000000000000002220446049250313080847263336181640625
==============================================================
Calculation 0.2 + 0.2
---------------------------------------------------------------
0.2=0.200000000000000011102230246251565404236316680908203125
+0.2=0.200000000000000011102230246251565404236316680908203125
---------------------------------------------------------------
0.4=0.40000000000000002220446049250313080847263336181640625
==============================================================
Answer
--------------------------------------------------------------
0.4=0.40000000000000002220446049250313080847263336181640625
==0.4=0.40000000000000002220446049250313080847263336181640625
---------------------------------------------------------------
Source:Is floating point math broken?