web-dev-qa-db-ja.com

Javaを使用して科学的表記なしでdouble値を印刷する方法を教えてください。

指数形式を使わずにJavaでdouble値を出力したい。

double dexp = 12345678;
System.out.println("dexp: "+dexp);

それはこのE記法を示しています:1.2345678E7

私はそれがこのようにそれを印刷したいです:12345678

これを防ぐための最善の方法は何ですか?

188
Despicable

printf()%fと一緒に使用できます。

double dexp = 12345678;
System.out.printf("dexp: %f\n", dexp);

これはdexp: 12345678.000000を印刷します。小数部分が不要な場合は、

System.out.printf("dexp: %.0f\n", dexp);

これは ドキュメント で説明されているフォーマット指定言語を使います。

元のコードで使用されているデフォルトのtoString()フォーマットは、ここでスペルアウト しています

100
NPE

要するに:

末尾のゼロとロケールの問題を取り除きたい場合は、次のようにします。

double myValue = 0.00000021d;

DecimalFormat df = new DecimalFormat("0", DecimalFormatSymbols.getInstance(Locale.ENGLISH));
df.setMaximumFractionDigits(340); // 340 = DecimalFormat.DOUBLE_FRACTION_DIGITS

System.out.println(df.format(myValue)); // Output: 0.00000021

説明:

なぜ他の答えが私に合わなかったのか:

  • doubleが10 ^ -3未満または10 ^ 7以上の場合、Double.toString()System.out.println、またはFloatingDecimal.toJavaFormatStringは科学表記法を使用します
  • %fを使用すると、デフォルトの10進精度は6です。それ以外の場合はハードコードできますが、小数点以下の桁数が少ない場合は余分なゼロが追加されます。例:

    double myValue = 0.00000021d;
    String.format("%.12f", myvalue); // Output: 0.000000210000
    
  • setMaximumFractionDigits(0);または%.0fを使用することで、整数/ longには問題ありませんが、doubleには問題はありません。

    double myValue = 0.00000021d;
    System.out.println(String.format("%.0f", myvalue)); // Output: 0
    DecimalFormat df = new DecimalFormat("0");
    System.out.println(df.format(myValue)); // Output: 0
    
  • DecimalFormatを使用することで、あなたはローカルに依存します。フランス語ロケールでは、小数点記号はコンマであり、小数点ではありません。

    double myValue = 0.00000021d;
    DecimalFormat df = new DecimalFormat("0");
    df.setMaximumFractionDigits(340);
    System.out.println(df.format(myvalue)); // Output: 0,00000021
    

    ENGLISHロケールを使用すると、プログラムが実行される場所にかかわらず、必ず小数点記号が得られます。

なぜsetMaximumFractionDigitsに340を使ったのですか?

2つの理由

  • setMaximumFractionDigitsは整数を受け入れますが、その実装はDecimalFormat.DOUBLE_FRACTION_DIGITSの最大許容桁数を持ちます。これは340です。
  • Double.MIN_VALUE = 4.9E-324は340桁なので、倍精度を丸めずに精度を失うことは確実です。
82
JBE

DecimalFormatで試すことができます。このクラスであなたはあなたの数を解析することにおいて非常に柔軟です。
使いたいパターンを正確に設定できます。
例えば、あなたの場合:

double test = 12345678;
DecimalFormat df = new DecimalFormat("#");
df.setMaximumFractionDigits(0);
System.out.println(df.format(test)); //12345678
26
Obl Tobl

BigDecimalのtoPlainString()を使った別の解決策がありますが、今回はStringコンストラクタを使います。

このコンストラクタは、Float.toStringおよびDouble.toStringによって返される値と互換性があります。これは、BigDecimal(double)コンストラクターの予測不能性の影響を受けないため、一般的にfloatまたはdoubleをBigDecimalに変換するのに推奨される方法です。

最短の形式では、このようになります。

return new BigDecimal(myDouble.toString()).stripTrailingZeros().toPlainString();

Java 8より前のバージョンでは、これは値がゼロのすべてのDoubleに対して「0.0」になるので、追加する必要があります。

if (myDouble.doubleValue() == 0)
    return "0";

NaNと無限値は追加でチェックする必要があります。

これらすべての考慮事項の最終結果

public static String doubleToString(Double d) {
    if (d == null)
        return null;
    if (d.isNaN() || d.isInfinite())
        return d.toString();

    // Pre Java 8, a value of 0 would yield "0.0" below
    if (d.doubleValue() == 0)
        return "0";
    return new BigDecimal(d.toString()).stripTrailingZeros().toPlainString();
}

これは、Floatでうまく動作するようにコピー/ペーストすることもできます。

15
Manuel

これはあなたの番号が整数である限り有効です。

double dnexp = 12345678;
System.out.println("dexp: " + (long)dexp);

Double変数が小数点以下の精度を持っているならば、それを切り捨てます。

8
NateS

Java/Kotlinコンパイラは、9999999を超える値(1000万以上)を科学表記法に変換します。イプシリオン表記.

例:12345678は1.2345678E7に変換されます

科学表記法への自動変換を避けるためにこのコードを使用してください。

fun setTotalSalesValue(String total) {
        var valueWithoutEpsilon = total.toBigDecimal()
        /* Set the converted value to your Android view using setText() function */
        salesTextView.setText() = valueWithoutEpsilon.toPlainString()
    }
4

私はいくつかのdouble値を通貨値に変換する必要があり、ほとんどの解決策は問題ないことがわかりましたが、私にとってはそうではありませんでした。

DecimalFormatは結局私のための道だったので、ここに私がしたことがあります:

   public String foo(double value) //Got here 6.743240136E7 or something..
    {
        DecimalFormat formatter;

        if(value - (int)value > 0.0)
            formatter = new DecimalFormat("0.00"); // Here you can also deal with rounding if you wish..
        else
            formatter = new DecimalFormat("0");

        return formatter.format(value);
    }

ご覧のとおり、数が自然であれば、2E7(など)ではなく20000000となります(小数点なし)。

そしてそれが10進ならば、私はたった2桁の10進数を得ます。

4
JamesC

次のコードは、提供された番号が科学表記で表示されているかどうかを検出します。そうであれば、それは通常の表示では最大25桁で表示されます。

 static String convertFromScientificNotation(double number) {
    // Check if in scientific notation
    if (String.valueOf(number).toLowerCase().contains("e")) {
        System.out.println("The scientific notation number'"
                + number
                + "' detected, it will be converted to normal representation with 25 maximum fraction digits.");
        NumberFormat formatter = new DecimalFormat();
        formatter.setMaximumFractionDigits(25);
        return formatter.format(number);
    } else
        return String.valueOf(number);
}
3
Memin

"x + 20/50"のような文字列をとるmath.Eval()関数への文字列入力としてそれを使用していたとき、私は本番コードでこれと同じ問題を抱えていました

私は何百もの記事を見ました...結局私はスピードのためにこれを使いました。そして、Eval関数は結局それをそれ自身の数フォーマットに変換し直すつもりだったので、math.Eval()は他のメソッドが返す最後のE-07をサポートしていなかった、 。

これは現在、1,000人以上のユーザーがいるアプリケーションの製品コードで使用されています...

double value = 0.0002111d;
String s = Double.toString(((int)(value * 100000.0d))/100000.0d); // Round to 5 dp

s display as:  0.00021
1
hamish

誰もが正しい考えを持っていたと思いますが、すべての答えは簡単ではありませんでした。これは非常に便利なコードです。これが機能するものの断片です。

System.out.println(String.format("%.8f", EnterYourDoubleVariableHere));

".8"は、表示したい小数点以下の桁数を設定する場所です。

私はEclipseを使用していますが、問題はありませんでした。

これが役に立ったことを願っています。フィードバックをいただければ幸いです。

1
Brian Castro

doubleで表される整数値の場合、このコードを使用することができます。これは他のソリューションよりもはるかに高速です。

public static String doubleToString(final double d) {
    // check for integer, also see https://stackoverflow.com/a/9898613/868941 and
    // https://github.com/google/guava/blob/master/guava/src/com/google/common/math/DoubleMath.Java
    if (isMathematicalInteger(d)) {
        return Long.toString((long)d);
    } else {
        // or use any of the solutions provided by others
        return Double.toString(d);
    }
}

// Java 8+
public static boolean isMathematicalInteger(final double d) {
    return StrictMath.rint(d) == d && Double.isFinite(d);
}
0
rmuller

私の解決策:文字列str = String.format( "%.0f"、yourDouble);

0