i不想限制大数字中的重要数字数量。我只想找到数字具有的重要数字的数量。
有没有将数字转换为字符串并计数数字字符的方法吗?
我相信您想要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"没有明确的数字。上面的代码在小数点之前将所有尾随的零视为显着。
乔恩答案的以下修改返回了我似乎正确的结果:
private static int significantDigits(BigDecimal input) {
return input.scale() <= 0
? input.precision() + input.stripTrailingZeros().scale()
: input.precision();
}
(请注意,在这些测试中input.stripTrailingZeros().scale()
似乎总是负面的。)
另外,正如我上面指出的那样,BigDecimal
无法区分一个具有重要数字的" 5000"和一个" 5000"的" 5000",例如,有两个数字。此外,根据定义," 5000"。(带有尾随的小数点)应该有四个重要的数字,但是BigDecimal
无法处理。(请参阅我使用的定义。)
乔恩的答案在大多数情况下是正确的,除了指数号:
private static int significantDigits(BigDecimal input) {
return input.scale() <= 0
? input.precision() + input.stripTrailingZeros().scale()
: input.precision();
}
假设输入为1.230000E17,函数返回18,但是正确的数字应为7。