【问题标题】:Rounding-up a decimal to 2 decimal places将小数四舍五入到小数点后 2 位
【发布时间】:2020-06-18 07:36:57
【问题描述】:

我无法将一个数字四舍五入到小数点后两位。

我的号码是 3106.4647771976413339683766317M。

正确的四舍五入到小数点后两位是 3106.47,但使用Math.Round(value, 2, MidpointRounding.AwayFromZero),数字是 3106.46。

问题是方法看小数点后三位进行四舍五入,但如果看小数点后第四位会生成正确的数字。

有人有类似的吗?

【问题讨论】:

  • 但是...寻找小数点后第三位是它应该做的。 0.464 应四舍五入为 0.46,因为第三位数字低于 5。
  • 如果尝试将.4647 舍入为.47。它不是正常意义上的一轮。大多数人会对此感到困惑
  • x 舍入到小数点后 2 位与将 x + 0.005 舍入到最接近的小数点后 2 位相同。
  • 无论如何,您需要证明“正确的四舍五入到小数点后两位是 3106.47”的说法,并向我们展示您需要的确切规则。否则没有办法回答这个问题

标签: c# rounding


【解决方案1】:

在数学上,正确的四舍五入到小数点后两位 3106.46。

你可能想要的是一个天花板

Math.Ceiling(3106.4647771976413339683766317M * 100) / 100

产生 3106.47。 Math.Ceiling 没有接受小数位数的版本,这就是为什么会有乘法和除法。

另外,请注意这个表达式中有一个警告:

Math.Round(value, 2, MidpointRounding.AwayFromZero) 

Math.Round 没有具有三个参数的变体,其中第一个是decimal。它有效,因为该值被隐式转换为double。但是,这是不需要的。

【讨论】:

    【解决方案2】:

    如果您真的想以这种方式四舍五入(比传统意义上的实际四舍五入更常见的错误),您可以从最右边的数字开始四舍五入,然后一次向左移动一个位置。

    double numberToRound = 3106.4647771976413339683766317;
    
    int placesToRoundTo = 2;
    int smallestPlaceIndex = 24; // you would need to determine this value
    
    for (int i = smallestPlaceIndex; i >= placesToRoundTo)
    {
        numberToRound = Math.Round(numberToRound, i, MidpointRounding.AwayFromZero);
    }
    

    没有一个简单的内置方法可以做到这一点,因为它不是正常的舍入。

    【讨论】:

    • 有——Math.Ceiling
    • @OndrejTucny Math.Ceiling 返回最接近的整数,它不允许您选择舍入发生的位置。我在您的回答中看到了如何使用它来实现所需的行为,但它本身并不能满足问题的要求,并且您的解决方案限制了可以转换的数字范围而不会出现溢出或精度错误,具体取决于位置您想四舍五入,因为对于大多数常见情况,范围的减少非常小。
    猜你喜欢
    • 1970-01-01
    • 2020-06-12
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多