Java 两个不同创建的BigDecimal的比较
我想将包含字段的对象与BigDecimal进行比较 第一种方法:Java 两个不同创建的BigDecimal的比较,java,Java,我想将包含字段的对象与BigDecimal进行比较 第一种方法: double sumItemsDouble = Arrays.asList(TestConstants.PRICES).stream() .mapToDouble(s -> Double.parseDouble(s)).sum(); BigDecimal sumItems = new BigDecimal(String.valueOf(sumItemsDouble)); 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);
第二种方法:
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);
创建账单:
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);
此方法的结果:
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
- 八百
Assert.assertThat(bill, is(expectedBill));
在比较之前,可以使用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);
下面是如何实现
等于并使用注释中提到的适当比较:
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));
这是一种非常奇怪的方式,将双精度
转换为字符串
,然后解析为BigDecimal
。只需执行BigDecimal sumtimes=newbigdecimal(sumtimesdouble)
。更妙的是,你能做到吗
Arrays.asList(PRICES).stream()
.map(BigDecimal::new)
.reduce(BigDecimal.ZERO, BigDecimal::add);
您可以使用compareTo方法检查它们在数值上是否相等:
bigDecimal1。compareTo(bigDecimal2)==0
@OHGODSPIDERS,但我必须比较整个对象。BigDecimal只是ObjectsShashCode中的fieldsimplement hashcode/equals之一。如果数值相同,则必须保持不变。我认为可以将BigDecimal值设置为相同的比例,那么equals应按预期工作setScale(0,…)
基本上会将所有内容都丢到小数点右侧。例如,如果BigDecimal b1=new BigDecimal(“800.01”)
和BigDecimal b2=new BigDecimal(“800”)代码>然后你的代码会说它们是一样的,我无法想象这是OP想要的。你可以在调用setScale时使用任何刻度,而不仅仅是零