2016-11-18 10 views
0

Для того, чтобы избежать возможной потери точности в работе Java на Double объектов, то есть:Сумма BigDecimal (ов) создано из возможного нуля Double

Double totalDouble = new Double(1590.0); 
Double taxesDouble = new Double(141.11); 
Double totalwithTaxes = Double.sum(totalDouble,taxesDouble); 
//KO: 1731.1100000000001 
System.out.println(totalwithTaxes); // 1731.1100000000001 

Я написал этот код, где totalDouble и taxesDouble может быть также null :

Double totalDouble = myObject.getTotalDouble(); 
Double taxesDouble = myObject.getTaxesDouble(); 
BigDecimal totalBigDecimalNotNull = (totalDouble==null) ? BigDecimal.valueOf(0d):BigDecimal.valueOf(totalDouble); 
BigDecimal taxesBigDecimalNotNull = (taxesDouble==null) ? BigDecimal.valueOf(0d):BigDecimal.valueOf(taxesDouble); 
BigDecimal totalWithTaxesBigDecimal = totalBigDecimalNotNull.add(taxesBigDecimalNotNull); 
System.out.println(totalWithTaxesBigDecimal); 

есть ли лучший способ (также с библиотеками третьей части, т.е. гуавы и т.д.), чтобы инициализировать BigDecimal в этих случаях (ноль, если Double является null и Double значение в противном случае)?

ответ

1

Не совсем. То есть вам все равно нужно принять решение, основанное на том, является ли значение null, но вы можете сделать его более чистым, если используете опциональный шаблон.

Вы можете изменить getTotalDouble и getTaxesDouble возвращается в Optional<Double> вместо mititgate того, чтобы сделать троичной ...

public Optional<Double> getTotalDouble() { 
    return Optional.ofNullable(totalDouble); 
} 

public Optional<Double> getTaxesDouble() { 
    return Optional.ofNullable(taxesDouble); 
} 

... Затем, вы можете использовать условную оценку, предоставленную самой Optional для оценки и вернуть значение по умолчанию.

BigDecimal totalBigDecimalNotNull = 
      BigDecimal.valueOf(myObject.getTotalDouble().orElse(0d)); 

Упрощение было бы вернуться Optional<BigDecimal> вместо этого, в отличие от преобразования значения, что вы хотите в этой моде.

В качестве дополнения, будьте осторожны, когда говорите о точности. There is standing advice использовать либо int, либо long вместо этого, чтобы не потерять точность монет.

+0

спасибо за подсказку об использовании «Дополнительный», я думаю, что буду использовать его в будущем. Для использования представления int или long for money я, к сожалению, не могу изменить этот выбор. Мне бы хотелось использовать целое число (и сосчитать cent) или использовать BigDecimal, но я работаю с фреймворком электронной торговли, и он использует double .. – user6904265

1

Если вы используете Optional или нет, я рекомендую создать статический вспомогательный метод, чтобы вам не пришлось повторять себя. например:

public static BigDecimal bigDecimalValueOfOrZero(Double val) { 
    return val == null ? BigDecimal.ZERO : BigDecimal.valueOf(val); 
}