我目前正在尝试从公式中计算出确切的数字,但是在转换整数的小数部分时遇到了问题,
例如,如果我将10除以3,我将得到3.3333,我的计算需要从3.2开始。如果我有6.5,我的计算需要关闭6.4。
我正在努力抓住这个移动数字的小数,然后只舍入该数字的小数部分。我的代码的一些示例在
下面// This number should be rounded down to the nearest .2
TopCalc = (In - UpperThreshold) * (TopPerc / 100);
// This number should be rounded down to the nearest .2
MidCalc = (UpperThreshold - LowerThreshold) * (MidPerc / 100);
// This number should be rounded down to the nearest .2
LowCalc = LowerThreshold * (LowPerc / 100);
decimal Total = TopCalc + MidCalc + LowCalc;
return Total;
所以进一步分解,让我们说每个0.2是20Cents / Pence硬币,90%的硬币不是法定货币,所以在你不得不给$ /£120.36的情况下,所有你需要改变的是20美分/便士,你只能给$ /£120.20,因为16Cents / Pence在这个例子中不构成一个完整的硬币。下面还有一些例子
1.235 = 1.2
1.599 = 1.4
1.611 = 1.6
1.799999999999 = 1.6
1.85 = 1.8
始终向下舍入到最接近的字面值0.2从不向上舍入。
答案 0 :(得分:2)
你可以使用像
这样的东西static decimal NthRound(decimal d, decimal nth)
{
var intPart = decimal.Truncate(d);
var fifth = decimal.Truncate(nth * (d - intPart)) / nth;
return intPart + fifth ;
}
然后
Console.WriteLine( NthRound(10M/2M, 5M));
Console.WriteLine( NthRound(10M/3M, 5M));
Console.WriteLine( NthRound(13M/2M, 5M));
得到
在这种情况下向下舍入到最接近的第5位
答案 1 :(得分:1)
您的小数是否总是正数,还是可以是负数?
我设法让这个工作,但它不是很优雅。可能有更好的解决方案:
decimal d = 2.235M;
int i;
d = Math.Round(d, 1);
i = (int) (d*10);
i = i >> 1;
i = i << 1;
d = (decimal) i/10;