从可能的null Double创建的BigDecimal的总和

时间:2016-11-18 17:53:08

标签: java double guava precision

为了避免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

我写了这段代码,其中totalDoubletaxesDouble也可以是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(如果DoublenullDouble值为零则为零否则)?

2 个答案:

答案 0 :(得分:1)

不是真的。也就是说,您仍然需要根据值是否为null做出决定,但如果使用“可选”模式,则可以更清洁。

您可以将getTotalDoublegetTaxesDouble返回更改为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使用intlong代替,以确保您不会丢失任何硬币精确度。

答案 1 :(得分:1)

您是否使用Optional我建议您创建一个静态帮助方法,这样您就不必重复自己。 e.g:

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