2

開始ゼロを無視して、いくつかのdouble値を特定の桁数にフォーマットしたいと思います。

たとえば、6桁にフォーマットするとします。

131.468627436358  ->  131.469
3.16227766016838  ->  3.16228
0.66018099039325  ->  0.660181
0.02236067977499  ->  0.0223607
4

4 に答える 4

3

BigDecimalを使用すると、有効数字を正しく処理できます。これ:

MathContext round3SigFig = new MathContext(3,RoundingMode.HALF_UP);
System.out.println((new BigDecimal(0.000923874932)).round(round3SigFig));

生成:

0.000924

ただし、明らかに、浮動小数点を任意精度のオブジェクト表現に渡すことは理想的ではありません。

于 2012-04-22T20:23:13.920 に答える
0

これを最後のチャンスのオプションと考えてください。「、」を念頭に置いて最初の6桁を取り、doubleに戻すことで、数値を文字列に変換するのはどうでしょうか。

于 2012-04-22T20:34:01.923 に答える
0

これは、次の質問と密接に関連していると思います。最大合計5桁を使用して倍精度値をフォーマットし、必要に応じて小数点以下を四捨五入します。

私がリンクした質問には、andを使用する答えがありますMathContextBigDecimalmaybeWeCouldStealAVanの答えのように)。しかし、総桁数を気にしたので、うまくいきませんでした。しかし、それはあなたのために働くかもしれません。

必要に応じて正確にフォーマットされた独自のカスタムソリューションを作成することになりました。おそらく、これは要件も満たしているか、要件を満たすように簡単に変更できます。

public static String format( double value, int totalDigits )
{
    String s = String.valueOf( value );
    int decimal = s.indexOf( '.' );

    // there is no decimal part, so simply return the String
    if ( decimal == -1 )
    {
        return s;
    }
    else
    {
        int finalLength;

        // example: 23.34324
        // the final result will be length totalDigits + 1 because we will include the decimal
        if ( decimal < totalDigits )
        {
            finalLength = totalDigits + 1;
        }
        // example: 99999
        // the final result will be length totalDigits because there will be no decimal
        else if ( decimal == totalDigits )
        {
            finalLength = totalDigits;
        }
        // example: 999999.999
        // we can't make the final length totalDigits because the integer portion is too large
        else
        {
            finalLength = decimal;
        }

        finalLength = Math.min( s.length( ), finalLength );

        return s.substring( 0, finalLength );
    }
}

public static void main( String[] args )
{
    double[] data = { 1, 100, 1000, 10000, 100000, 99999, 99999.99, 9999.99, 999.99, 23.34324, 0.111111 };
    for ( double d : data )
    {
        System.out.printf( "Input: %10s \tOutput: %10s\n", Double.toString( d ), format( d, 5 ) );
    }
}
于 2012-04-22T20:34:31.897 に答える
0

対数関数を使用して、必要な追加の桁数を計算します。

public static int leadingZeros (double d) {
    return (d >= 1.0) ? 0 : (int) (-1 * (Math.floor (Math.log (d) / Math.log (10))));
}

にとって

    System.out.println (leadingZeros (4));
    System.out.println (leadingZeros (0.4));
    System.out.println (leadingZeros (0.04));
    System.out.println (leadingZeros (0.004));

0、1、2、3を返します。

于 2012-04-22T20:39:36.533 に答える