C#中的十进制类型的自定义舍入

时间:2011-01-27 10:18:14

标签: c# rounding

球员, 我正在写一个四舍五入的方法。输入是十进制类型(保证四位小数)。舍入规则是忽略0.005或更小,即查看小数点后三位 - 如果它是<= 5,则向下舍入向上舍入。 一些用例:82.3657 - &gt; 82.36,82.3667 - &gt; 82.37,82.5967 - &gt; 82.60,82.9958 - &gt; 82.99,82.9968 - &gt; 83.00 有什么好主意吗?我按照以下方式解决了这个问题。

private decimal CustomRound(decimal x)
{
   decimal rX = Math.Truncate(x * 100) / 100;
   decimal x3DecPlaces = Math.Truncate(x * 1000) / 1000;
   decimal t = (x3DecPlaces * 1000) % 10;
   if (t >= 6)
      rX = rX + 0.01m;
   return rX;
}

3 个答案:

答案 0 :(得分:7)

我不相信有任何内置的东西,因为这是一个非常不寻常的要求(例如1.3358接近1.33而不是1.34的想法很奇怪)。您的代码看起来合理。

编辑:你不能使用MidpointRounding来获得你想要的效果,因为你开始四舍五入的点不是中点 - 它是(比方说)1.336而不是正常的1.335。只有1.335被视为1.33和1.34之间的中点,因为 是中点。你已经以一种不同寻常的方式在这里有效地进行了偏向。

你甚至不能截断为三个DP,然后使用MidpointRounding,因为没有“朝向零”模式。

一个稍微奇怪的选择是自己有效地执行偏见:

private static decimal CustomRound(decimal x)
{
    return decimal.Round(x - 0.001m, 2, MidpointRounding.AwayFromZero);
}

因此它将82.3657视为82.3647并将其舍入为82.36;它会对待82.3667和82.3657并将其四舍五入为82.37,它将82.5967视为82.5957并将其四舍五入为82.60等。我认为可以做你想做的事情 - 但仅限于正值。您需要准确计算出负值所需的行为。

无论你做什么,都需要非常清楚地记录下来:)

作为一个偏好问题,我会使用decimal.Truncate而不是Math.Truncate,只是为了更清楚地表明一切都是用小数来完成的。

答案 1 :(得分:0)

您希望如何处理负值?我想你会想要-13.999到-14到-13.99对不到?

在这种情况下,您的+/- 0.01m应取决于x是否为正面。

这是一种更简单的方法:

decimal CustomRound(decimal x)
{
    var offset = x >= 0 ? -0.001m : 0.001m;
    return Decimal.Round(x + offset, 2, MidpointRounding.AwayFromZero);
}

答案 2 :(得分:-1)

也许您可以使用Math.Round(Double,Int32)方法?