从可能的 null Double 创建的 BigDecimal 的总和
Sum of BigDecimal(s) created from possible null Double
为了避免在 Java 对 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
和 [=12=,则为零] 否则值)?
不是真的。也就是说,您仍然需要根据值是否为 null
来做出决定,但是如果您使用 Optional 模式,您可以做得更干净。
您可以将 getTotalDouble
和 getTaxesDouble
return 更改为 Optional<Double>
而不是 mititgate 必须执行三元...
public Optional<Double> getTotalDouble() {
return Optional.ofNullable(totalDouble);
}
public Optional<Double> getTaxesDouble() {
return Optional.ofNullable(taxesDouble);
}
...然后,您可以使用Optional
本身提供的条件评估来评估和return一个默认值。
BigDecimal totalBigDecimalNotNull =
BigDecimal.valueOf(myObject.getTotalDouble().orElse(0d));
一种简化方法是 return Optional<BigDecimal>
,而不是以这种方式转换您想要的值。
作为附录,在谈论精度时要小心。 There is standing advice 改为使用 int
或 long
以确保您不会丢失任何硬币精度。
无论您是否使用 Optional
,我都建议您创建一个静态辅助方法,这样您就不必自己重复了。例如:
public static BigDecimal bigDecimalValueOfOrZero(Double val) {
return val == null ? BigDecimal.ZERO : BigDecimal.valueOf(val);
}
为了避免在 Java 对 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
和 [=12=,则为零] 否则值)?
不是真的。也就是说,您仍然需要根据值是否为 null
来做出决定,但是如果您使用 Optional 模式,您可以做得更干净。
您可以将 getTotalDouble
和 getTaxesDouble
return 更改为 Optional<Double>
而不是 mititgate 必须执行三元...
public Optional<Double> getTotalDouble() {
return Optional.ofNullable(totalDouble);
}
public Optional<Double> getTaxesDouble() {
return Optional.ofNullable(taxesDouble);
}
...然后,您可以使用Optional
本身提供的条件评估来评估和return一个默认值。
BigDecimal totalBigDecimalNotNull =
BigDecimal.valueOf(myObject.getTotalDouble().orElse(0d));
一种简化方法是 return Optional<BigDecimal>
,而不是以这种方式转换您想要的值。
作为附录,在谈论精度时要小心。 There is standing advice 改为使用 int
或 long
以确保您不会丢失任何硬币精度。
无论您是否使用 Optional
,我都建议您创建一个静态辅助方法,这样您就不必自己重复了。例如:
public static BigDecimal bigDecimalValueOfOrZero(Double val) {
return val == null ? BigDecimal.ZERO : BigDecimal.valueOf(val);
}