十进制的 C# 中点向下舍入选项

C# midpoint round down option for decimal

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

例如使用两位小数四舍五入,150.415四舍五入为150.41150.4151四舍五入为150.42。我不太确定这个舍入机制叫什么。

为了在 C# 中复制相同的行为,我尝试使用 Math.Round(amount, 2, MidpointRounding.AwayFromZero)Math.Round(amount, 2, MidpointRounding.ToEven),但两者都将上述数字四舍五入为 150.42 想看看我在这里有什么选择,包括编写自定义函数来进行类似的舍入?

#include <iostream>
#include <cmath>
using namespace std;
double roundN(double val, int len)
{
    double result;

    result = val * pow(10.0, len);
    result = static_cast<double>(static_cast<int>(result + 0.5));

    result = result * pow(10.0, -len);

    return result;
}

int main() {
    double a;
    cout<<"enter number"<<endl;
    cin>>a;
    a=roundN(a,2);
    std::cout << a;
    return 0;
}

我认为这就是你需要的逻辑:

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,因此它们会适当补偿)。

解释假设舍入没有小数: 因为 Ceiling1.01 - 2.00 转换为 2,通过 -0.5 你是将其转换为执行 0.51 - 1.501 的逻辑,因此 1.51 - 2.502,这就是你需要的。

如果您需要在应用中的任何地方使用它,您可能需要使用扩展方法,这需要一个单独的静态助手 class:

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