Я переводил .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.