Mis*_*sky 4 c# math console-application
我注意到一些奇怪的行为,同时添加两个双打,有时它的工作正确,有时不行!
这是第一个例子:
double num1 = 0.1 + 0.7; //Guess the result?
Run Code Online (Sandbox Code Playgroud)
容易 - 0.8 !!! 或不?
看看奇怪的结果:

猜猜是什么,if语句在else块内,并打印num1- 而不,它不打印0.799999999999993,它打印0.8.
所以我向前迈了一步,尝试了这段代码:
if (0.1 + 0.7 == 0.8) //Returns false ??
{
Console.WriteLine("Correct");
}
Run Code Online (Sandbox Code Playgroud)
好的,很奇怪,但现在我找到了正确的方法,它应该使用f(float).我记得double有很多空格,所以它可以包含更多的数字,也许这就是原因.
float num2 = 0.1f + 0.7f;
if (num2 == 0.8f) //Perfect - finally works !!!
{
Console.WriteLine("Correct");
}
else
{
Console.WriteLine(num2);
}
Run Code Online (Sandbox Code Playgroud)
但是现在,我试试这个 - 再次它返回错误,为什么?
if (0.1f + 0.7f == 0.8f) //Returns false :(
{
Console.WriteLine("Correct");
}
Run Code Online (Sandbox Code Playgroud)
手表在调试时会产生:

谁能解释我这里有什么问题?那些错误吗?
提前致谢.
浮点运算不精确.您应该阅读文章科学家应该知道的关于浮点运算的文章.如果你希望你的计算是在一个小数的意义精确,你应该使用decimal类型,其中0.1m + 0.7m == 0.8m为true.你应该注意decimal使用浮点数就像float和double,除了基数是10,而不是2.因为处理基数2是如此容易和高度优化,decimal要慢得多.它也有自己的不准确性,只有在处理可以用少量十进制数字(如0.7和0.1)表示的数字时才准确,这使得它对财务数据有利.
理解浮点数的另一篇有用的文章是维基百科的双精度浮点格式.