两个 BigDecimal 的比较创建方式不同



我想将包含字段的对象与 BigDecimal 进行比较

第一种方法:

double sumItemsDouble = Arrays.asList(TestConstants.PRICES).stream()
.mapToDouble(s -> Double.parseDouble(s)).sum();
BigDecimal sumItems = new BigDecimal(String.valueOf(sumItemsDouble));

第二种方法:

BigDecimal sumItems = items.stream().map(Item::getPrice)
.reduce(BigDecimal.ZERO, BigDecimal::add);

创建账单:

Bill bill = new Bill();
bill.setTotalAmount(sumItems);

此方法的结果:

  • 800,0
  • 800

我想比较两个对象,但它们不同,因为此字段中的值不匹配

Assert.assertThat(bill, is(expectedBill));

以下是您如何实现equals并使用注释中提到的正确比较:

class MyClass {
BigDecimal value;
// ... other fields
public boolean equals(Object o) {
if (o == this) return true;
boolean result = (o instance of MyClass); 
if (result) {
MyClass other = (MyClass) o);
result = areOtherFieldsEqual(other);
result = result && (value.compareTo(other.value) == 0);
}
return result;
}
// also implement hashCode()
}

作为旁注,

double sumItemsDouble = Arrays.asList(TestConstants.PRICES).stream()
.mapToDouble(s -> Double.parseDouble(s)).sum();
BigDecimal sumItems = new BigDecimal(String.valueOf(sumItemsDouble));

是一种非常奇怪的转换方式,double转换为String,然后解析为BigDecimal。只是做BigDecimal sumItems = new BigDecimal(sumItemsDouble).更好的是,做

Arrays.asList(PRICES).stream()
.map(BigDecimal::new)
.reduce(BigDecimal.ZERO, BigDecimal::add);

您可以在比较之前使用 setScale 方法。

BigDecimal b1 = BigDecimal.valueOf(800.0).setScale(2, RoundingMode.HALF_UP);
BigDecimal b2 = BigDecimal.valueOf(800).setScale(2, RoundingMode.HALF_UP);
b1.equals(b2);

相关内容

最新更新