java - 在 BigDecimal 中查找有效数字位数的好方法?

标签 java bigdecimal significant-digits

我不想限制 BigDecimal 中有效数字的数量。我只想找到该数字的有效数字位数。

有没有办法不用将数字转换为字符串并计算数字字符就可以做到这一点?

最佳答案

我相信你想要 stripTrailingZeros 的组合, precisionscale ,如此处所示:

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/

相关文章:

java - 如何在没有错误的情况下启动我的 Android SQLite 应用程序

java - 声明一个没有数组列表的数组

java - BigDecimal 精度高于 1E22

c++ - 如何左移最低有效零?

java - 尝试在 Java 中打印数组时出现异常

java - 如何使用 Java 制作真正大的 boolean 数组?

java - 为什么当我使用 BigDecimal 时它会不断舍入

javascript - Web 客户端上的大十进制

precision - 有没有办法在 Octave 中打印至少 20 位有效数字?

r - 地板和天花板有 2 位或更多有效数字