我相信你想要一个
stripTrailingZeros,
precision和
scale的组合,如下所示:
import java.math.*;
public class Test {
public static void main(String[] args) {
test("5000"); // 4
test("5000.00"); // 4
test("5000.12"); // 6
test("35000"); // 5
test("35000.00"); // 5
test("35000.12"); // 7
test("35000.120"); // 7
test("0.0034"); // 2
test("1.0034"); // 5
test("1.00340"); // 5
}
private static void test(String input) {
System.out.println(input + " => " +
significantDigits(new BigDecimal(input)));
}
private static int significantDigits(BigDecimal input) {
input = input.stripTrailingZeros();
return input.scale() < 0
? input.precision() - input.scale()
: input.precision();
}
}
需要调用stripTrailingZeros,否则BigDecimal完全有可能以“非规范化”形式存储.例如,新的BigDecimal(5000)的精度为4,而不是1.
对scale()的调用用于处理规范化形式在小数点之前具有尾随零但在小数点之后没有任何内容的情况.在这种情况下,比例将始终为负,并指示尾随零的数量.
编辑:尾随零但没有小数点的情况本质上是模糊的 – 例如,没有确定数量的有效数字“5000”.上面的代码将小数点前的所有尾随零视为重要.