可以查明 BigDecimal 是否仅在某个点后重复出现零?

Possible to find out if a BigDecimal only has zeros recurring after a certain point?

具体来说,我想知道是否可以确定小数点后 2 位是否始终为零。

例如在这种情况下:

    BigDecimal m1 = new BigDecimal("15");
    BigDecimal m2 = new BigDecimal("2");
    BigDecimal m3 = m1.divide(m2, 5, BigDecimal.ROUND_CEILING);
m3 is equal to 7.50000 (and there will still be 0s even if you increase the precision)

一个不是这种情况的例子

    BigDecimal m1 = new BigDecimal("11.24");
    BigDecimal m2 = new BigDecimal("6");
    BigDecimal m3 = m1.divide(m2, 5, BigDecimal.ROUND_CEILING);
m3 is equal to 1.87334

另一种可能情况并非如此(想不出除法值)是

 m3 is equal to 7.50000001

感谢您的帮助(如果答案是 straightforward/simple,我深表歉意!)

您可以将数字向上和向下舍入并比较:

BigDecimal m1 = new BigDecimal("15.0001");
System.out.println(m1.round(new MathContext(2, RoundingMode.FLOOR))
                      .equals(m1.round(new MathContext(2, RoundingMode.CEILING))));
// prints false

m1 = new BigDecimal("15.000");
        System.out.println(m1.round(new MathContext(2, RoundingMode.FLOOR))
                             .equals(m1.round(new MathContext(2, RoundingMode.CEILING))));
// prints true

使用 setScale() 来 trim 去掉小数点后 2 位后的所有内容,然后 compareTo() 看看它在数学上是否等于原始值:

class BigDecimalExperiment {
    static boolean isEverythingAfterTwoDigitsZero(BigDecimal bd) {
        return (bd.compareTo(bd.setScale(2, RoundingMode.DOWN)) == 0);
    }

    public static void main(String[] args) {
        List<BigDecimal> values = Arrays.asList(
                new BigDecimal("7.5"),
                new BigDecimal("7.50000"),
                new BigDecimal("7.50000001"),
                new BigDecimal("75.01"),
                new BigDecimal(75.01),
                new BigDecimal("75.0100000"),
                new BigDecimal("75.0100001")
        );
        for (BigDecimal value : values) {
            System.out.printf("%s\t%s%n", isEverythingAfterTwoDigitsZero(value), value);
        }
    }
}

打印

true    7.5
true    7.50000
false   7.50000001
true    75.01
false   75.0100000000000051159076974727213382720947265625
true    75.0100000
false   75.0100001

内置的stripTrailingZeros怎么样。那么你就不用再做额外的舍入计算了。

m3.stripTrailingZeros().scale() <= 2