球员, 我正在写一个四舍五入的方法。输入是十进制类型(保证四位小数)。舍入规则是忽略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;
}
答案 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)方法?