我正在执行一些计算并将结果插入到数据库中。
我的问题是,我得到的答案似乎是四舍五入而不是向上。这看起来似乎并不重要,但在大量销售过程中,美分开始加起来!!
Decimal pubCut = rrp * (percentageCutD / 100);
Decimal retCut = rrp * retailerCut;
Decimal edcut = rrp * edpercentage;
老实说,我对数字很垃圾,整个数学函数都是我在大学里试图避免的。任何人都可以告诉我如何将这些数字用于向上而不是向下?
答案 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
这就是你要找的东西吗?