可以查明 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
具体来说,我想知道是否可以确定小数点后 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