BigDecimal的规范表示

0xb*_*7ed 7 java math equals bigdecimal canonicalization

BigDecimal包含任意值的Java简化为规范形式的最简单方法是什么,以便BigDecimal使用该equals()方法将两个代表相同数字的数字相等?

我使用这样的代码从任意字符串解析我的数字:

BigDecimal x = new BigDecimal(string1, MathContext.DECIMAL64);
BigDecimal y = new BigDecimal(string2, MathContext.DECIMAL64);
Run Code Online (Sandbox Code Playgroud)

由于(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);
Run Code Online (Sandbox Code Playgroud)

将会成功...:

public static BigDecimal canonicalize(BigDecimal b) {
    // TODO:
}
Run Code Online (Sandbox Code Playgroud)

dur*_*597 3

如果你想知道两个BigDecimals 是否相等,无论大小如何,只需使用.compareTo()

public static boolean bigDecimalEquals(BigDecimal b1, BigDecimal b2) {
    return b1.compareTo(b1) == 0;
}
Run Code Online (Sandbox Code Playgroud)

Javadoc 中特别推荐了这一点

此方法认为两个值相等但比例不同(例如 2.0 和 2.00)的 BigDecimal 对象相等。该方法优先于六个布尔比较运算符(<、==、>、>=、!=、<=)中每一个的单独方法。


如果您确实想转换,BigDecimal以便.equals()可以使用,只需使用该setScale方法即可。