小数点后第一位有效数字的位置

Position of first significant digit after the decimal point

如何计算分数中第一个有效数字的位置?

以下是一些具有所需输出的示例输入

0.123456    // 1st sign. number position = 1
0.0012345   // ...                       = 3
0.000012345 // ...                       = 5

您可以遍历它,计算在它大于或等于一之前需要乘以十的次数:

public static int significantDigitNum (double d) {
    int cnt = 0;
    while (d < 1) {
        d *= 10;
        ++cnt;
    }
    return cnt;
}

编辑:
正如 David Conrad 评论的那样,此功能仅适用于正数。也支持底片:

public static int significantDigitNum (double d) {
    int cnt = 0;
    d = Math.abs(d);
    while (d < 1) {
        d *= 10;
        ++cnt;
    }
    return cnt;
}

无需循环。您可以简单地使用以下公式:

Math.ceil(-Math.log10(d))

示例:

public static int firstSignificant(double d) {
    return (int) Math.ceil(-Math.log10(d));
}

// Usage
System.out.println(firstSignificant(0.123456));    // 1
System.out.println(firstSignificant(0.0012345));   // 3
System.out.println(firstSignificant(0.000012345)); // 5

关于一些特殊情况的说明:

  • 0 没有第一个有效数字。对于这种情况,公式的计算结果为 Integer.MAX_VALUE.
  • 您没有指定负值应该发生什么,但如果您希望它们表现得像正值,您可以在公式中使用 Math.abs(d) 而不是 d

您可以检查每个字符是否为 1-9 之间的数字。

    String numberString = "0.000012345";
    int position = 1;
    for(int i=0;i<numberString.length();i++){           
        if(String.valueOf(numberString.charAt(i)).matches("[1-9]")){
            position=i-1;
            break;
        }
    }