2016-09-19 7 views
-4

У меня есть следующие коды, округленные по прямой скорости до 15 знаков после запятой. Когда _ForwardRate составляет 13 555,0, результат возвращается неправильно.Java Округление до 15 знаков после запятой

public double round(double Number, int Decimal_Place) {  
    if (Number==0) return 0; 
    double _plug = 0.000001; 
    if (Number < 0) { 
     _plug = -0.000001; 
    } 
    //Sometime a number is rounded down to 2.22499999999 by java. 
    //Actual precision is 2.245. Without this plug, a 2 dp rounding result 
    //in 2.22 when it should be 2.23 
    double _newNumber = Number; 
    if (Decimal_Place==2) { 
     _newNumber = _newNumber+_plug;  
    } 

    double _number_abs = Math.abs(_newNumber); 
    double _factor = Math.pow(10, Decimal_Place); 
    double _rd = Math.round(_number_abs * _factor); 
    double _r = _rd/_factor; 
    if (Number <= 0) 
     _r = _r * -1; 

    return _r; 
} 

Double _ForwardRate = getForward_rate(); 
BigDecimal _fwdrate_bd = BigDecimal.valueOf(_ForwardRate.doubleValue()); 
_ForwardRate = round(new Double(_fwdrate_bd.doubleValue()), 15); 

Текущий результат

9,223.372036854777 

Ожидаемый результат

13,555.000000000000000 
+2

Что такое функция 'round'? – Li357

+0

@AndrewL. Я редактировал свой пост. – bittersour

+0

Нечто, за исключением округления, неверно, если вы ожидаете '13 555' по сравнению с' 9,223' –

ответ

1

Ваша проблема заключается в том, что Math.round(double a) возвращает long, и вы переполнены.

Один простой способ сделать это состоит в использовании BigDecimal:

public static double round(double number, int decimalPlaces) { 
    return BigDecimal.valueOf(number) 
        .setScale(decimalPlaces, RoundingMode.HALF_UP) 
        .doubleValue(); 
} 

Это позволяет контролировать режим округления. Обратите внимание, что округление, сделанное Math.round(), является HALF_CEILING, которое не поддерживается setScale().

Возможно, вы захотите сделать все, что вы используете, используя BigDecimal, если вам нужен этот уровень точности.

0

Рассмотрим:

double _number_abs = Math.abs(_newNumber); 

На данный момент, _number_abs содержит значение 13555,0

double _factor = Math.pow(10, Decimal_Place); 

Теперь _factor содержит 1.0E15

double _rd = Math.round(_number_abs * _factor); 

Согласно Javadoc

Math.round() Возвращает ближайшие долго аргумент, с связью округления к положительной бесконечности.

Поскольку _number_abs * _factor является 1.3555E19, который больше, чем Long.MAX_VALUE, результат Long.MAX_VALUE, то есть «ближайший» Long чтобы данное значение.

 Смежные вопросы

  • Нет связанных вопросов^_^