【问题标题】:How can I round numbers up instead of down?如何向上而不是向下舍入数字?
【发布时间】:2010-11-12 08:57:57
【问题描述】:

我正在执行一些计算并将结果插入数据库。

我的问题是,我得到的答案似乎是向下取整而不是向上取整。这似乎并不重要,但在大量销售过程中,美分开始增加!

Decimal pubCut = rrp * (percentageCutD / 100);
Decimal retCut = rrp * retailerCut;
Decimal edcut = rrp * edpercentage;

说实话,我对数字很垃圾,而整个数学函数是我在大学里试图避免的。谁能告诉我如何让这些数字向上取整而不是向下取整?

【问题讨论】:

  • 你能把rrppercentageCutDretailerCutedpercentage的类型发一下吗?
  • 抱歉,都是十进制数。
  • “整个数学函数是我在大学里试图避免的”。在这种情况下回到大学,因为这种缺乏知识会在你的余生中困扰你。
  • 您的问题似乎暗示 C# 将始终向下舍入,而实际上 C# 将“正确”向上或向下舍入到最接近的整数。舍入问题不一定总是通过四舍五入来解决,如果您的问题是部分相加不等于整体,则四舍五入可能会引入一个新问题,即部分相加大于整体。

标签: c#


【解决方案1】:

使用Math.Ceiling() 方法。

double[] values = {7.03, 7.64, 0.12, -0.12, -7.1, -7.6};
Console.WriteLine("  Value          Ceiling          Floor\n");
foreach (double value in values)
   Console.WriteLine("{0,7} {1,16} {2,14}", 
                     value, Math.Ceiling(value), Math.Floor(value));
// The example displays the following output to the console:
//         Value          Ceiling          Floor
//       
//          7.03                8              7
//          7.64                8              7
//          0.12                1              0
//         -0.12                0             -1
//          -7.1               -7             -8
//          -7.6               -7             -8

【讨论】:

    【解决方案2】:

    你的问题是这样的

    (percentageCutD / 100)
    

    由于 100 是一个 int,它将执行整数除法,因此 150/100 变为 1。您可以通过确保 100 是小数来解决此问题,因为您希望最后得到小数。将您的代码更改为。

    (percentageCutD / 100D)
    

    但是,如果您总是想将 1.1 等值舍入到 2,那么您将不得不使用 Math.Ceiling 来完成此操作。如果您出于某种原因想要避免使用 Math 类(我不明白您为什么要这样做,您可以将结果加 1 并将其强制转换为 int 以有效地四舍五入到最接近的整数。

    【讨论】:

    • @Øyvind Bråthen - 仅当 percentageCutD 也是整数时才会发生整数除法。就目前而言,问题中没有足够的信息。
    • 如果 percentCutD 是 double 或 decimal 类型,那么 devision 就可以了
    • 然后使用 Math.Ceiling() 进行四舍五入 :)
    • 我只是假设它是一个 int ,因为 OP 说它向下取整,而他根本没有编写任何代码来向上或向下取整。所以我的假设是这里有一个整数除法。但我当然可能是错的。 OP 可以很有希望地证实这一点。
    • percentageCutD 是十进制类型。我将使用 Math.Ceiling()。感谢您的回复。
    【解决方案3】:

    .Net 的 Math.Round 函数使用通常被称为银行家四舍五入的方法,它通过将 0.5 舍入到最接近的偶数来工作,即 22.5 = 22 和 23.5 = 24。这在四舍五入时提供了更均匀的分布。

    另外值得注意的是,SQL 服务器不使用银行四舍五入

    【讨论】:

      【解决方案4】:

      您的收入百分比可能不会增加到 100 %。通过从总数中减去其他分数的总和来计算您的分数。

      var v = 100D;
      var p1 = 33D/100;
      var p2 = 33D/100;
      var p3 = 33D/100;
      var v1 = p1*v;
      var v2 = p2*v;
      var v3 = p3*v;
      var sum = v1 + v2 + v3;
      

      很遗憾,sum 是 99 而不是 100。

      你可以像这样计算v3

      var v3 = v - (v1 + v2);
      

      或者更好地修复传入百分比中的舍入误差:

      【讨论】:

        猜你喜欢
        • 2016-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多