首页 > 解决方案 > 小数的 C# 中点向下舍入选项

问题描述

我正在使用一个外部支付系统,该系统在精确的中点使用向下舍入,但如果超过此值,则向上舍入。我想在我的应用程序中复制相同的值以匹配该值。

例如,带有两位小数的四舍五入,150.415四舍五入到150.41150.4151四舍五入到150.42。我不完全确定这种舍入机制叫什么。

为了在 C# 中复制相同的行为,我尝试使用Math.Round(amount, 2, MidpointRounding.AwayFromZero)and Math.Round(amount, 2, MidpointRounding.ToEven),但两者都将上述数字四舍五入到150.42 Trying to see what are my options here,包括编写自定义函数来进行类似的舍入?

标签: c#.netmathrounding

解决方案


我认为这是您需要的逻辑:

public static decimal DigitalRiverRounding(decimal value)
{
    if (value < 0)
        return Math.Floor(value * 100 + 0.5m) / 100m;
    return Math.Ceiling(value * 100 - 0.5m) / 100m;
}

如果您确定没有涉及负数,您当然可以删除前两行。我假设对于负数,所需的输出是镜像的(-150.415=> -150.41,因此它们进行了适当的补偿)。

假设舍入没有小数的解释: asCeiling转换1.01 - 2.002,通过这样做,-0.5您将其转换为执行0.51 - 1.50to 1,因此1.51 - 2.50to的逻辑2,这就是您所需要的。

如果您需要在应用程序的任何地方使用它,您可能需要使用扩展方法,它需要一个单独的静态帮助器类:

public static decimal ToDigitalRiverRounding(this decimal value)
{
    if (value < 0)
        return Math.Floor(value * 100 + 0.5m) / 100m;
    return Math.Ceiling(value * 100 - 0.5m) / 100m;
}

推荐阅读