指数形式を使わずにJavaでdouble値を出力したい。
double dexp = 12345678;
System.out.println("dexp: "+dexp);
それはこのE記法を示しています:1.2345678E7
。
私はそれがこのようにそれを印刷したいです:12345678
これを防ぐための最善の方法は何ですか?
要するに:
末尾のゼロとロケールの問題を取り除きたい場合は、次のようにします。
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.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桁なので、倍精度を丸めずに精度を失うことは確実です。DecimalFormat
で試すことができます。このクラスであなたはあなたの数を解析することにおいて非常に柔軟です。
使いたいパターンを正確に設定できます。
例えば、あなたの場合:
double test = 12345678;
DecimalFormat df = new DecimalFormat("#");
df.setMaximumFractionDigits(0);
System.out.println(df.format(test)); //12345678
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でうまく動作するようにコピー/ペーストすることもできます。
これはあなたの番号が整数である限り有効です。
double dnexp = 12345678;
System.out.println("dexp: " + (long)dexp);
Double変数が小数点以下の精度を持っているならば、それを切り捨てます。
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()
}
私はいくつかの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進数を得ます。
次のコードは、提供された番号が科学表記で表示されているかどうかを検出します。そうであれば、それは通常の表示では最大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);
}
"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
誰もが正しい考えを持っていたと思いますが、すべての答えは簡単ではありませんでした。これは非常に便利なコードです。これが機能するものの断片です。
System.out.println(String.format("%.8f", EnterYourDoubleVariableHere));
".8"
は、表示したい小数点以下の桁数を設定する場所です。
私はEclipseを使用していますが、問題はありませんでした。
これが役に立ったことを願っています。フィードバックをいただければ幸いです。
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);
}
私の解決策:文字列str = String.format( "%.0f"、yourDouble);