gpt4 book ai didi

C#简单的数学运算得到奇怪的结果

转载 作者:行者123 更新时间:2023-12-04 17:22:21 27 4
gpt4 key购买 nike

我注意到在添加两个 double 时出现了一些奇怪的行为,有时它可以正常工作,有时却不能!

这是第一个例子:

double num1 = 0.1 + 0.7; //Guess the result?

简单 - 0.8 !!!或不?

看看奇怪的结果:

enter image description here

猜猜看,if 语句进入 else 块,并打印 num1 - 不,它不打印 0.799999999999993,它打印 0.8。

所以我又向前迈进了一步并尝试了以下代码:
if (0.1 + 0.7 == 0.8) //Returns false ??
{
Console.WriteLine("Correct");
}

好吧,奇怪,但现在我找到了正确的方法,它应该使用 f (float)。我记得 double 有很多空格,所以它可以包含更高的数字,也许这就是原因。
float num2 = 0.1f + 0.7f;

if (num2 == 0.8f) //Perfect - finally works !!!
{
Console.WriteLine("Correct");
}
else
{
Console.WriteLine(num2);
}

但是现在,我尝试这样做 - 它再次返回 false,为什么?
if (0.1f + 0.7f == 0.8f) //Returns false :(
{
Console.WriteLine("Correct");
}

调试时观察结果:

enter image description here

有人可以解释我这里有什么问题吗?那些是bug吗?

提前致谢。

最佳答案

浮点运算并不精确。您应该阅读文章 What Every Computer Scientist Should Know About Floating-Point Arithmetic .如果您希望您的计算在十进制意义上精确,您应该使用 decimal 类型,其中 0.1m + 0.7m == 0.8mtrue .你应该注意到 decimal使用浮点数就像 floatdouble ,除了基数是 10,而不是 2。由于处理基数 2 更容易且高度优化,decimal慢得多。它也有其自身的不准确之处,它仅在处理可以用一小部分十进制数字表示的数字(如 0.70.1 )时才精确,因此非常适合金融数据。

另一篇了解浮点数的有用文章是 Wikipedia's Double-precision floating-point format .

关于C#简单的数学运算得到奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19606998/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com