十进制的 C# 中点向下舍入选项
C# midpoint round down option for decimal
我正在使用一个外部支付系统,该系统在精确的中点处使用向下舍入,但如果不止于此则向上舍入。我想在我的应用程序中复制相同的内容以匹配值。
例如使用两位小数四舍五入,150.415
四舍五入为150.41
,150.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
,因此它们会适当补偿)。
解释假设舍入没有小数: 因为 Ceiling
将 1.01 - 2.00
转换为 2
,通过 -0.5
你是将其转换为执行 0.51 - 1.50
到 1
的逻辑,因此 1.51 - 2.50
到 2
,这就是你需要的。
如果您需要在应用中的任何地方使用它,您可能需要使用扩展方法,这需要一个单独的静态助手 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;
}
我正在使用一个外部支付系统,该系统在精确的中点处使用向下舍入,但如果不止于此则向上舍入。我想在我的应用程序中复制相同的内容以匹配值。
例如使用两位小数四舍五入,150.415
四舍五入为150.41
,150.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
,因此它们会适当补偿)。
解释假设舍入没有小数: 因为 Ceiling
将 1.01 - 2.00
转换为 2
,通过 -0.5
你是将其转换为执行 0.51 - 1.50
到 1
的逻辑,因此 1.51 - 2.50
到 2
,这就是你需要的。
如果您需要在应用中的任何地方使用它,您可能需要使用扩展方法,这需要一个单独的静态助手 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;
}