我不想限制 BigDecimal 中有效数字的数量。我只想找到该数字的有效数字位数。
有没有办法不用将数字转换为字符串并计算数字字符就可以做到这一点?
最佳答案
我相信你想要 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
完全有可能以“非规范化”形式存储。例如,new BigDecimal(5000)
的精度为 4,而不是 1。
对 scale()
的调用用于处理规范化形式在小数点前有尾随零但后没有尾随零的情况小数点。在这种情况下,比例将始终为负数,表示尾随零的数量。
编辑:带有尾随零但没有小数点的情况本质上是模棱两可的——例如,“5000”没有明确的有效数字位数。上面的代码将小数点前的所有尾随零视为有效。
关于java - 在 BigDecimal 中查找有效数字位数的好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21443740/