【问题标题】:Always Round UP a value in C#在 C# 中始终向上舍入一个值
【发布时间】:2014-02-06 09:44:59
【问题描述】:

我想根据小数点后第三位进行四舍五入。它应该始终采用 UP 值和四舍五入。我使用了 Math.Round,但它没有像我预期的那样产生结果。

场景 1

var value1 = 2.526;
var result1 = Math.Round(value1, 2); //Expected: 2.53 //Actual: 2.53

场景 2

var value2 = 2.524;
var result2 = Math.Round(value2, 2); //Expected: 2.53 //Actual: 2.52

场景 1 没问题。它正在产生我预期的结果。 在第二种情况下,我的金额为 2.522。我想考虑第三个小数点(在这种情况下是“4”),它应该向上取整。预期结果为 2.53

无论小数点后第 3 位是多少(小于 5 或​​大于 5),都应该向上取整。

谁能给我一个解决方案?我不认为 Math.Round 在这里帮助了我。

【问题讨论】:

  • 如果您对小数点感兴趣,也许您应该使用decimal 类型而不是double?你想代表什么样的价值?
  • “但它没有像我预期的那样产生结果。” - 老实说,“总是向上取整”并不是很多人期望的结果。
  • 另外值得指出的是 Math.Round 经常被误解:stackoverflow.com/questions/977796/…

标签: c# double decimal roundup


【解决方案1】:

正如 Jon 所说,请改用小数。然后你可以这样做总是用 2 个小数点四舍五入。

Math.Ceiling(value2 * 100) / 100

【讨论】:

    【解决方案2】:
    var value2 = 2.524;
    var result2 = Math.Round(value2, 2); //Expected: 2.53 //Actual: 2.52
    if(result2 < value2)
        result += 0.01; // actual 2.53
    

    【讨论】:

    • 根据我提出的问题,这是正确的(四舍五入比较小数点后第三位)。
    【解决方案3】:

    最后我想出了一个解决方案。我改进了 Sinatr 的回答如下,

    var value = 2.524;
    var result = RoundUpValue(value, 2); // Answer is 2.53
    
    public double RoundUpValue(double value, int decimalpoint)
    {
        var result = Math.Round(value, decimalpoint);
        if (result < value)
        {
            result += Math.Pow(10, -decimalpoint);
        }
        return result;
    }
    

    【讨论】:

      【解决方案4】:

      这个呢:

      Math.Round(Value+0.005,2)
      

      【讨论】:

      • 请注意,执行此操作时需要强制中点向下舍入,否则 0.000 可能会向上;并且没有“向下”MidpointRounding 模式...
      • @SonerGönül 这是一个很常见的把戏;不过天花板版本更好
      • 看起来像舍入到 2dp 并且如果 3rd dp > 0 总是向上舍入 3rd dp。虽然这可能应该是 Value+0.005-EPSILON? O.o.
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多