代码之家  ›  专栏  ›  技术社区  ›  Sergey

C#数学的意外行为。圆形的

  •  0
  • Sergey  · 技术社区  · 2 年前

    我有代码:

    Math.Round(45.4545m, 2, MidpointRounding.AwayFromZero)
    

    结果是 45.45 。看起来应该是 45.46 具有 MidpointRounding.AwayFromZero 。我做错了什么?

    45.46 而不是 45.45 具有 中点舍入。Away FromZero

    1 回复  |  直到 2 年前
        1
  •  2
  •   StuperUser    2 年前

    从…起 MidpointRounding documentation :

    四舍五入到最接近的数字的策略,当一个数字在另外两个数字之间时,它会向离零最近的数字四舍五舍五入。

    将45.4545四舍五入到2位小数意味着你要取45.45,并决定如何四舍四入.004。正如格里弗斯将军在评论中所说,这还不到另外两个的一半,它更接近于.00,而不是0.01,所以它将四舍五入到45.45,而不是45.46。

    以下代码:

    Console.WriteLine($"{Math.Round(45.451m, 2, MidpointRounding.AwayFromZero)} = Math.Round({45.451m}, 2, MidpointRounding.AwayFromZero)");
    Console.WriteLine($"{Math.Round(45.452m, 2, MidpointRounding.AwayFromZero)} = Math.Round({45.452m}, 2, MidpointRounding.AwayFromZero)");
    Console.WriteLine($"{Math.Round(45.453m, 2, MidpointRounding.AwayFromZero)} = Math.Round({45.453m}, 2, MidpointRounding.AwayFromZero)");
    Console.WriteLine($"{Math.Round(45.454m, 2, MidpointRounding.AwayFromZero)} = Math.Round({45.454m}, 2, MidpointRounding.AwayFromZero)");
    Console.WriteLine($"{Math.Round(45.455m, 2, MidpointRounding.AwayFromZero)} = Math.Round({45.455m}, 2, MidpointRounding.AwayFromZero)");
    Console.WriteLine($"{Math.Round(45.456m, 2, MidpointRounding.AwayFromZero)} = Math.Round({45.456m}, 2, MidpointRounding.AwayFromZero)");
    

    给出输出:

    45.45 = Math.Round(45.451, 2, MidpointRounding.AwayFromZero)
    45.45 = Math.Round(45.452, 2, MidpointRounding.AwayFromZero)
    45.45 = Math.Round(45.453, 2, MidpointRounding.AwayFromZero)
    45.45 = Math.Round(45.454, 2, MidpointRounding.AwayFromZero)
    45.46 = Math.Round(45.455, 2, MidpointRounding.AwayFromZero)
    45.46 = Math.Round(45.456, 2, MidpointRounding.AwayFromZero)
    

    你可能在想 Math.Floor method ,请参阅及其在问题中的使用示例 Rounding down to 2 decimal places in c#

    对于您问题中给出的示例:

    Console.WriteLine($"{Math.Floor((45.4545) * 100) / 100} = Math.Floor((45.4545) * 100) / 100");
    Console.WriteLine($"{Math.Floor((45.4541) * 100) / 100} = Math.Floor((45.4541) * 100) / 100");
    Console.WriteLine($"{Math.Floor((45.4542) * 100) / 100} = Math.Floor((45.4542) * 100) / 100");
    Console.WriteLine($"{Math.Floor((45.4543) * 100) / 100} = Math.Floor((45.4543) * 100) / 100");
    Console.WriteLine($"{Math.Floor((45.4544) * 100) / 100} = Math.Floor((45.4544) * 100) / 100");
    Console.WriteLine($"{Math.Floor((45.4545) * 100) / 100} = Math.Floor((45.4545) * 100) / 100");
    Console.WriteLine($"{Math.Floor((45.4546) * 100) / 100} = Math.Floor((45.4546) * 100) / 100");
    

    给出输出:

    45.45 = Math.Floor((45.4545) * 100) / 100
    45.45 = Math.Floor((45.4541) * 100) / 100
    45.45 = Math.Floor((45.4542) * 100) / 100
    45.45 = Math.Floor((45.4543) * 100) / 100
    45.45 = Math.Floor((45.4544) * 100) / 100
    45.45 = Math.Floor((45.4545) * 100) / 100
    45.45 = Math.Floor((45.4546) * 100) / 100
    
    推荐文章