舍入数字而不是向下| C#

时间:2010-11-12 08:57:57

标签: c#

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

我的问题是,我得到的答案似乎是四舍五入而不是向上。这看起来似乎并不重要,但在大量销售过程中,美分开始加起来!!

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

老实说,我对数字很垃圾,整个数学函数都是我在大学里试图避免的。任何人都可以告诉我如何将这些数字用于向上而不是向下?

7 个答案:

答案 0 :(得分:12)

使用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

答案 1 :(得分:5)

你的问题是这个

(percentageCutD / 100)

由于100是一个int,它将执行整数除法,因此150/100变为1.你可以通过确保100是小数来解决这个问题,因为你最后想要一个小数作为结果。将您的代码更改为。

(percentageCutD / 100D)

但是,如果您总是希望将值尽可能地舍入为1.1到2,那么您必须使用Math.Ceiling来完成此操作。如果您出于某种原因想要避开Math类(我不明白为什么要这样做,您可以在结果中添加1并将其转换为int以有效地向上舍入到最接近的整数。

答案 2 :(得分:2)

您是否正在寻找Math.Ceiling

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

或者,您可以在向下舍入之前向结果添加0.49 ...下注天花板是正确的方法;)

答案 5 :(得分:1)

您的传入百分比可能不会增加到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);

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

答案 6 :(得分:1)

使用System.Math的Ceiling方法将最大数字舍入到最接近的整数。

例如:

Decimal retCut = Math.Ceiling(rrp * edpercentage);

因此,如果edpercentage为5,rrp为20.23,则舍入结果为102而不是101.15

这就是你要找的东西吗?