添加浮点数,为什么第一个代码有效

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
---------------------------------------------------------------
  1. Source:Is floating point math broken?

  2. Source:Why 0.1 Does Not Exist In Floating-Point

  3. Further Guide About Float Point

  4. Guide By Oricle

  5. Examine Number

  6. IEEE 754 double-precision binary floating-point format