1. ホーム
  2. java

[解決済み] 精度を落とさずにfloatをdoubleに変換する

2022-02-04 15:16:39

質問

プリミティブなfloatがあり、プリミティブなdoubleとして必要です。単にfloatをdoubleにキャストすると、変な精度になります。例えば

float temp = 14009.35F;
System.out.println(Float.toString(temp)); // Prints 14009.35
System.out.println(Double.toString((double)temp)); // Prints 14009.349609375

しかし、キャストする代わりに float を文字列として出力し、その文字列を double としてパースすると、望みのものが得られます。

System.out.println(Double.toString(Double.parseDouble(Float.toString(temp))));
// Prints 14009.35

Stringまで往復するよりも良い方法はないでしょうか?

どのように解決するのですか?

あなたが 実は それは、floatが元々目指していた数値を正確に表現していなかったからです。ダブルは は元のfloatを正確に表現しています。 toString は、すでに存在していた "extra" データを表示しています。

たとえば、(この数字は正しいものではなく、私が勝手に作ったものですが)次のようなものがあったとします。

float f = 0.1F;
double d = f;

では f はちょうど0.100000234523になるかもしれません。 d はまったく同じ値ですが、文字列に変換するときに、より高い精度で正確であることを信頼し、それほど早く四捨五入しないので、すでに存在していたにもかかわらず隠されていた余分な桁が見えることになります。

文字列に変換して戻すと、元のfloat値よりも文字列値に近いdouble値になってしまいますが、これは良いことだけです。 もし は、文字列の値が本当に欲しいものであると信じているのです。

ここで使用する型は、float/double で間違いないでしょうか? BigDecimal ? もし、小数点以下の正確な値を持つ数値(例えば、お金)を使おうとしているのなら BigDecimal の方がより適切な型であると思います。