我正在执行一些计算并将结果插入到数据库中。
我的问题是,我得到的答案似乎是向下取整而不是向上取整。这可能看起来并不重要,但在大量销售的过程中,美分开始增加!
Decimal pubCut = rrp * (percentageCutD / 100);
Decimal retCut = rrp * retailerCut;
Decimal edcut = rrp * edpercentage;
老实说,我对数字一窍不通,整个数学函数都是我在大学里尽量避免的。谁能告诉我怎样才能使这些数字向上取整而不是向下取整?
发布于 2010-11-12 09:01:47
使用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
发布于 2010-11-12 09:01:21
你的问题是
(percentageCutD / 100)
因为100是一个整数,所以它将执行整数除法,这样150/100就变成了1。你可以通过确定100是一个小数来解决这个问题,因为你想要一个小数作为结果。将代码更改为。
(percentageCutD / 100D)
但是,如果您总是希望将值四舍五入,甚至像1.1那样向上舍入到2,那么您将不得不使用Math.Ceiling
来实现。如果您出于某种原因想要避免使用Math
类(我不明白您为什么要这样做),您可以在结果中添加1并将其转换为int
,从而有效地向上舍入到最接近的整数。
发布于 2010-11-12 09:36:28
.NET的Math.Round函数使用了一些通常被称为银行家舍入的东西,其工作原理是将.5舍入到最接近的偶数,即22.5 = 22和23.5 = 24。这在舍入时提供了更均匀的分布。
还值得注意的是,SQL服务器不使用银行家舍入
https://stackoverflow.com/questions/4162957
复制