【发布时间】:2017-01-13 22:52:14
【问题描述】:
我正在将 .NET 代码翻译成 Java,但遇到了精度不匹配的问题。
.NET 代码:
private decimal roundToPrecision(decimal number, decimal roundPrecision)
{
if (roundPrecision == 0)
return number;
decimal numberDecimalMultiplier = Math.Round(number / roundPrecision, MidpointRounding.AwayFromZero);
return numberDecimalMultiplier * roundPrecision;
}
在上面的代码中调用roundToPrecision(8.7250, 0.05); 函数会得到8.75,这是预期的。
函数到Java的转换/翻译如下。我找不到确切的
Math.Round选项。
Java 代码:
public double roundToPrecision(double number, double roundPrecision) {
if (roundPrecision == 0)
return number;
int len = Double.toString(roundPrecision).split("\\.")[1].length();
double divisor = 0d;
switch (len) {
case 1:
divisor = 10d;
break;
case 2:
divisor = 100d;
break;
case 3:
divisor = 1000d;
break;
case 4:
divisor = 10000d;
break;
}
double numberDecimalMultiplier = Math.round(number / roundPrecision);
double res = numberDecimalMultiplier * roundPrecision;
return Math.round(res * divisor) / divisor;
}
在 Java 代码中调用 roundToPrecision(8.7250, 0.05); 会得到 8.7,这是不正确的。
我什至尝试使用C# Double Rounding 此处的参考在Java 中修改代码BigDecimal,如下所示,但没有运气。
public double roundToPrecision(double number, double roundPrecision) {
if (roundPrecision == 0)
return number;
int len = Double.toString(roundPrecision).split("\\.")[1].length();
double divisor = 0d;
switch (len) {
case 1:
divisor = 10d;
break;
case 2:
divisor = 100d;
break;
case 3:
divisor = 1000d;
break;
case 4:
divisor = 10000d;
break;
}
BigDecimal b = new BigDecimal(number / roundPrecision);
b = b.setScale(len,BigDecimal.ROUND_UP);
double numberDecimalMultiplier = Math.round(b.doubleValue());
double res = numberDecimalMultiplier * roundPrecision;
return Math.round(res * divisor) / divisor;
}
请指导我如何解决此问题。
这里有几个场景可供尝试。
- 号码=
10.05;精度=.1;预期 =10.1; - 号码=
10.12;精度=.01;预期 =10.12; - 号码=
8.7250;精度=0.05;预期 =8.75; - 号码=
10.999;精度=2;预期 =10; - 号码=
6.174999999999999;精度=0.05;预期 =6.20;
注意:我有超过 6 万个数字,精度可以从小数点后 1 位到小数点后 4 位不等。 .NET 的输出应该与 Java 完全匹配。
【问题讨论】:
标签: java c# .net rounding precision