3

我知道 MidpointRounding.AwayFromZero 和 MidpointRounding.ToEven,但我想我想要介于两者之间的东西。它用于促销模块,因此如果值为 0.5,则折扣价格必须向下舍入。

例如,我想:

£1.244 四舍五入为 £1.24
1.245 英镑四舍五入为 1.24 英镑
1.246 英镑四舍五入至 1.25 英镑

据我了解,.AwayFromZero 会将中间值四舍五入为 1.25 英镑,.ToEven 将正确四舍五入为 1.24 英镑,但 1.335 英镑将四舍五入为 1.34 英镑,而不是我想要的 1.33 英镑。

有谁知道如何做到这一点?

谢谢,乔恩

4

3 回答 3

3

有很多未指定的行为。让我们保持安全并明确地进行四舍五入,忽略负面因素,因为这是关于金钱的:

    public static decimal Promotion(decimal value) {
        decimal unround = decimal.Floor(value * 100m);
        decimal fraction = value * 100m - unround;
        if (fraction <= 0.5m) return unround / 100m;
        else return (unround + 1m) / 100m;
    }
于 2012-10-01T20:50:54.083 回答
2
Math.ceiling(x - 0.5)

应该做的伎俩。

于 2012-10-01T20:03:41.157 回答
0

通常要做这样的事情,你从你的价值中减去 0.001,然后正常四舍五入。

1.244 - .001 = 1.243 = 1.24
1.245 - .001 = 1.244 = 1.24
1.246 - .001 = 1.245 = 1.25

1.300 - .001 = 1.299 = 1.3

在这种情况下,你真的想把它放在它自己的函数/扩展方法中,无论如何,并用函数记录为什么你在舍入之前减去 .001。

于 2012-10-01T20:00:29.500 回答