【问题标题】:How to use BigDecimal .equal() in java?如何在 java 中使用 BigDecimal .equal()?
【发布时间】:2022-11-27 18:56:10
【问题描述】:
import java.math.BigDecimal;

public class test {
    public static void main(String[] args) {
        BigDecimal b1 = new BigDecimal("0.1");
        BigDecimal b2 = new BigDecimal("0.2");
        System.out.println(b1.multiply(b2));  // the result is 0.02 
        System.out.println(b1.multiply(b2).equals("0.02")); // boolean is false
        System.out.println(b1.add(b2)); //the result is 0.3
        System.out.println(b1.add(b2).equals("0.3")); // boolean is false
    }
};

我不知道为什么 .equals 结果总是错误的?谢谢你的回答。

【问题讨论】:

    标签: java bigdecimal


    【解决方案1】:

    您正在比较 BigDecimalString

    代替

    b1.add(b2).equals("0.3")
    

    你应该使用

    b1.add(b2).equals(new BigDecimal("0.3"))
    

    【讨论】:

      【解决方案2】:

      这与浮点运算有关。虽然 0.01 在十进制系统中似乎很容易写下来,但在二进制系统中却可能相当困难。浮点运算将值保留到只有那么多位数,这意味着可以开始舍入。应用运算时应该知道这些精度问题。

      您不使用 float 或 double 但即使 BigDecimal 也不会改变基本问题。

      https://en.wikipedia.org/wiki/Floating-point_arithmetic#Accuracy_problems

      顺便说一句,好的算法会考虑到这种不准确性,并安排它们的计算,以便最终的舍入效应相互抵消。

      【讨论】:

      • 我根本不买这个。它是一个 BigDecimal,它会准确地表示“0.1”
      猜你喜欢
      • 1970-01-01
      • 2022-01-24
      • 2015-02-26
      • 1970-01-01
      • 1970-01-01
      • 2014-02-26
      • 2011-04-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多