我想将包含字段的对象与 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);