为了避免Double
对象上Java操作的精度损失,例如:
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
值为零则为零否则)?
答案 0 :(得分:1)
不是真的。也就是说,您仍然需要根据值是否为null
做出决定,但如果使用“可选”模式,则可以更清洁。
您可以将getTotalDouble
和getTaxesDouble
返回更改为Optional<Double>
,而不是改为必须执行三元组...
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
代替,以确保您不会丢失任何硬币精确度。
答案 1 :(得分:1)
您是否使用Optional
我建议您创建一个静态帮助方法,这样您就不必重复自己。 e.g:
public static BigDecimal bigDecimalValueOfOrZero(Double val) {
return val == null ? BigDecimal.ZERO : BigDecimal.valueOf(val);
}