7

BigDecimal将包含任意值的 Java 简化为规范形式的最简单方法是什么,以便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:
}
4

2 回答 2

3

如果您想知道BigDecimal无论比例如何,两个 s 是否相等,只需使用.compareTo()

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

在 Javadoc 中特别推荐这个

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


如果您真的想转换,BigDecimal那么.equals()只需使用该setScale方法即可。

于 2014-10-13T21:47:45.933 回答
1

使用stripTrailingZeros(). 这将返回比例最小的等价物BigDecimal,并且是获得规范表示的最简单方法。这比它更好,setScale()因为它避免了四舍五入的任何问题。

于 2016-05-13T06:13:36.847 回答