gpt4 book ai didi

c# - Math.Round() 为 double 产生意想不到的结果

转载 作者:太空狗 更新时间:2023-10-29 22:23:29 27 4
gpt4 key购买 nike

我在我的代码中偶然发现了一个方法,其中舍入值在我的代码中计算错误。我知道比较 double 值会产生意外结果的问题。

例子

    double x = 19.08;
double y = 2.01;
double result = 21.09;

if (x + y == result)
{
// this is never reached
}

此处解释:http://csharpindepth.com/Articles/General/FloatingPoint.aspx

但是,直到现在,我都希望 Math.Round() 方法即使是 double 值也是准确的。

看看这段代码。

        var decimals = 2;
var value1 = 4.725;
var value2 = 4.725M;

var result1 = Math.Round(value1, decimals, MidpointRounding.ToEven);
var result2 = Math.Round(value1, decimals, MidpointRounding.AwayFromZero);
var result3 = Math.Round(value2, decimals, MidpointRounding.ToEven);
var result4 = Math.Round(value2, decimals, MidpointRounding.AwayFromZero);

Console.WriteLine("Double (ToEven): {0}", result1); // outputs 4.72
Console.WriteLine("Double (AwayFromZero): {0}", result2); // outputs 4.72 (expected: 4.73)
Console.WriteLine("Decimal (ToEven): {0}", result3); // outputs 4.72
Console.WriteLine("Decimal (AwayFromZero): {0}", result4); // outputs 4.73

对我来说,result2 应该是 4.73 是完全清楚的。然而,事实并非如此。谁能解释一下为什么?

最佳答案

嗯,您可能需要重新考虑您的“完全清楚”的概念,因为 4.725(相对于 4.625)不能double 精确表示。其实就是

4.7249999999999996447286321199499070644378662109375

请记住, float 只是实数数学概念的近似值——许多关于数字应如何表现的直觉概念并不适用。您最终得到的值大约 4.725,但显然略低于它。因此,中点舍入模式在这里不会执行任何操作,因为它不在要舍入的两个可能数字的中间。

关于c# - Math.Round() 为 double 产生意想不到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12158085/

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