C# Math.Round (1.785m, 2) 未正确舍入 [已关闭]

C# Math.Round (1.785m, 2) not rounded correctly [closed]

提问人:Jan Wiesemann 提问时间:9/14/2023 更新时间:9/14/2023 访问量:77

问:


想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。

2个月前关闭。

当我尝试将数字四舍五入到两位数时,我遇到了一个小问题。使用十进制数据类型可能无法正确表示该数字,因为它仍然是一个浮点数。1.785m

我会排除结果,但它是四舍五入/显示为 .我的问题是,我怎样才能获得正确的结果?1.79m1.78m

我目前的解决方法如下所示:

long l = (long)(1.785m * 1000m);
bool roundUp = l % 10 >= 5;

l = l / 10;

if(roundUp)
    l++;

decimal result = l \ 100;
C# 数学 十进制 舍入误差

评论

0赞 Robert Dodier 9/14/2023
我认为你所看到的是英语中所谓的“四舍五入”或“银行家的四舍五入”。这个问题似乎是一样的:stackoverflow.com/questions/977796/......
0赞 500 - Internal Server Error 9/14/2023
你可以做.Math.Round(1.785m, 2, MidpointRounding.AwayFromZero)
3赞 Jon Skeet 9/14/2023
“使用十进制数据类型可能无法正确表示该数字,因为它仍然是一个浮点数。不过,它是一个十进制浮点数,因此绝对可以正确表示。
2赞 NetMage 9/14/2023
请注意,Math.Round 的文档清楚地解释了“将中点值四舍五入到最接近的偶数”:8 是偶数,9 是奇数。
0赞 Martheen 9/14/2023
这回答了你的问题吗?为什么 Math.Round(2.5) 返回 2 而不是 3?

答:

2赞 Mike 'Pomax' Kamermans 9/14/2023 #1

您需要将舍入模式显式设置为:MidpointRounding.AwayFromZero

using System;

namespace HelloWorld
{
  class Program
  {
    static void Main(string[] args)
    {
      double d, r;
      d = 1.785;
      r = Math.Round(d, 2, MidpointRounding.AwayFromZero);
      Console.WriteLine(r); // 1.79

      d = -1.785;
      r = Math.Round(d, 2, MidpointRounding.AwayFromZero);
      Console.WriteLine(r); // -1.79, not -1.78
    }
  }
}

但根据这些代码注释:这与负数的罐子上所说的完全一样,负数将向下舍入而不是向上。如果需要 0.5 始终向上舍入,则需要 ,但根据您的 .NET 版本,可能不支持该枚举。Math.ToPositiveInfinity

0赞 thibsc 9/14/2023 #2

您必须使用第三个参数来根据需要进行舍入(参见 Math.Round):

Math.Round(1.785, 2, MidpointRounding.AwayFromZero); // 1.79