Я переводил .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;
}
Вызов roundToPrecision(8.7250, 0.05); в коде Java дает мне 8.7, и это неверно.
Я даже пробовал модифицировать код с помощью BigDecimal следующим образом в Java, используя ссылку здесь С# Double Rounding, но не повезло.
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;
}
Пожалуйста, помогите мне, что мне нужно сделать, чтобы исправить это.
Вот несколько сценариев, которые можно попробовать.
- number =
10.05; точность =.1; Ожидаемый =10.1; - number =
10.12; точность =.01; Ожидаемый =10.12; - number =
8.7250; точность =0.05; Ожидаемый =8.75; - number =
10.999; точность =2; Ожидаемый =10; - number =
6.174999999999999; точность =0.05; Ожидаемый =6.20;
Примечание. У меня более 60 тысяч чисел, и точность может варьироваться от 1 десятичной до 4 знаков после запятой. Результат .NET должен точно соответствовать Java.