代码之家  ›  专栏  ›  技术社区  ›  Salman Arshad

舍入到偶数131.575得到奇数而不是偶数

  •  2
  • Salman Arshad  · 技术社区  · 6 年前

    考虑以下代码示例:

    var tests = new List<double> { 131.505, 131.515, 131.525, 131.535, 131.545, 131.555, 131.565, 131.575, 131.585, 131.595 };
    foreach (double n in tests)
    {
        Console.WriteLine("{0} => {1}", n, Math.Round(n, 2, MidpointRounding.ToEven));
    }
    

    And its output :

    131.505 => 131.5
    131.515 => 131.51 <- wt*
    131.525 => 131.52
    131.535 => 131.54
    131.545 => 131.54
    131.555 => 131.56
    131.565 => 131.56
    131.575 => 131.57 <- wt*
    131.585 => 131.58
    131.595 => 131.6
    

    I was expecting :

    131.515 => 131.52
    131.575 => 131.58
    

    为什么 MidpointRounding.ToEven 算法产生一个最后有一个奇数的数;我能做些什么来解决这个问题吗?

    背景:我将同样的数字传递给PHP round($n, 2, PHP_ROUND_HALF_EVEN)

    我很欣赏这个例子中的一个解释,因为“在这个例子中,一个被打破了的数学解释”。我想知道为什么PHP能够产生预期的结果,而.NET却不能?我想知道.NET的浮点是否损坏,而不是浮点本身。

    1 回复  |  直到 6 年前
        1
  •  4
  •   Eric Postpischil    6 年前

    使用浮点数时会发生多个舍入。

    131.515 double 双重的

    所以,什么时候 Math.round

    正如马克·迪金森在一篇评论中指出的, Math.Round 131.525 ,转换为 双重的 产量131.525000000000005684318860801486968994140625。将其四舍五入到小数点后的两位小数应产生131.53。然而, 数学。四舍五入

    所以我们不能期望 产生正确的结果。