class Test
{
public static void main(String[] arg2)
{
float num = 1234.123126f;
System.out.println(num);
}
}
出力:1234.1232 なぜ1234.123または1234.1231でないのですか?浮動小数点データ型の混乱
class Test
{
public static void main(String[] arg2)
{
float num = 1234.123126f;
System.out.println(num);
}
}
出力:1234.1232 なぜ1234.123または1234.1231でないのですか?浮動小数点データ型の混乱
System.out.println(float)
String.valueOf(float)
(Float.toString(float)
)を呼び出します。
どのように多くの桁が
m
またはa
の小数部分のために印刷されている必要があります答えは
Float.toString(float)
のドキュメントにありますか?小数点以下の桁数を表す桁は少なくとも1桁でなければなりませんが、float型の隣接する値と引数の値を一意に区別するために必要な桁数を超えないようにしてください。それは、任意の隣接float
値から一意に識別可能であるfloat
データ型によって、最も近い値の表現であるため
したがって、1234.1232
印刷しました。
それは[Java往復する最短の文字列を常に印刷するとは限りません](http://www.exploringbinary.com/java-doesnt-print-the-shortest-strings-that-round-trip/)。 –
私はあなたの意見を参照してください。あなたの丸めロジックが正しいです。しかし、float
データ型を使用しているので、ある程度の精度が失われます。したがって、JVMが丸めを行うと、値は1234.1232に達しています。
これは、正確な値を四捨五入しているために発生しています。正確な値をそのまま出力したい場合は、Oracle tutorialの例を使用して書式を指定する必要があります。
まず、a float can only reliably store up to 6 digits; 1234.123126は長すぎて浮動小数点として格納できず、小数点として正確に復元できません。
Javaは、内部浮動小数点値を復元できる10進文字列を出力します。最悪の場合、9桁の数字が必要ですが、十分に少なくてもかまいません。 1234.123126の内部フロート値は1234.1231689453125です。 9桁に丸められ、1234.12317です。しかし、1234.1232は同じフロートに変換され、短くなるので、Javaはそれを選択します。 1234.123046875
実際にはnumの正確な値は1234.1231689453125です。printlnはこの値を特定する最短の一意の番号を丸めて表示します(この場合は丸められます)言い換えれば、 "1234.1232は、8桁で表現できる実際の値に最も近い数字です"。詳細はhttp://floating-point-gui.deを参照してください。 – yshavit