舍入小数到最接近的第5个c#

时间:2017-04-30 22:10:56

标签: c# rounding

我目前正在尝试从公式中计算出确切的数字,但是在转换整数的小数部分时遇到了问题,

例如,如果我将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从不向上舍入。

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));

得到

enter image description here

在这种情况下向下舍入到最接近的第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;