java - BigDecimal 的规范表示

标签 java math equals bigdecimal canonicalization

减少 Java 的最简单方法是什么 BigDecimal包含规范形式的任意值,以便表示相同数字的两个 BigDecimal 使用 equals() 比较相等方法?

我正在使用如下代码从任意字符串中解析我的数字:

BigDecimal x = new BigDecimal(string1, MathContext.DECIMAL64);
BigDecimal y = new BigDecimal(string2, MathContext.DECIMAL64);

因为 (string1, string2) 是任意的,它们可以是,例如 ("1", "1.0000") 或 ("-32.5", "1981")...

我正在寻找的是上述断言所针对的规范化方法的最简单(最短/最干净的代码)实现

assert x.compareTo(y) != 0 ||
    (canonicalize(x).equals(canonicalize(y)) && 
     x.compareTo(canonicalize(x)) == 0 && y.compareTo(canonicalize(y)) == 0);

会成功...:

public static BigDecimal canonicalize(BigDecimal b) {
    // TODO:
}

最佳答案

如果你想知道两个 BigDecimal 是否相等而不考虑比例,只需使用 .compareTo()

public static boolean bigDecimalEquals(BigDecimal b1, BigDecimal b2) {
    return b1.compareTo(b1) == 0;
}

特别推荐这个in the Javadoc

Two BigDecimal objects that are equal in value but have a different scale (like 2.0 and 2.00) are considered equal by this method. This method is provided in preference to individual methods for each of the six boolean comparison operators (<, ==, >, >=, !=, <=).


如果您真的想转换 BigDecimal 以便 .equals() 可以工作,只需使用 setScale方法。

关于java - BigDecimal 的规范表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26348679/

相关文章:

java - Netty 5不听java

c# - 整数的 Math.Floor

java - Java 中的默认等于实现如何适用于 String?

java - CharBuffer equals() 方法究竟是如何工作的?

java - 将 sql 中的多个列映射到 java 对象

java - Netbeans 平台应用程序中的 OSGi 配置管理服务

algorithm - 负数的模数

java - 计算多边形顶点的外角

java - 通过将对象的属性/属性与字符串进行比较来检查对象列表是否已存在

java - 如何迭代 jsoup 标签,但忽略前两个发现?