Java 两个不同创建的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

我想将包含字段的对象与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时使用任何刻度,而不仅仅是零