11

最近、浮動小数点表現についてたくさん読みました(これを含む:浮動小数点の算術および小数で0.1を表現する方法)。これで、0.1を正しく表現できないことがわかりました。これを行うと、次のようになります。

System.out.println(2.0f - 1.9f);

正確な結果は得られません。

したがって、問題は次のとおりです。0.1を正しく印刷するために、次のコードで0.1fをどのように表現しますか?それはある種の糖衣ですか?私が上で述べた記事では、次のように述べています。メモリ内で0.100000001490116119384765625として表される0.1。では、なぜこのコードでこの出力が得られないのですか?

System.out.println(0.1f);

Javaはこれをどのように処理しますか?

4

2 に答える 2

18

System.out.printlnフロートとダブルの丸めを実行します。これはFloat.toString()、それ自体(oraclew JDK内)がFloatingDecimalクラスに委任するを使用します。詳細については、のソースをFloatingDecimal#toJavaFormatString()参照してください。

試してみると:

BigDecimal bd = new BigDecimal(0.1f);
System.out.println(bd);

0.1fの実際の値が表示されます:0.100000001490116119384765625。

于 2012-08-26T09:01:45.700 に答える
6

のドキュメントからFloat.toString(float)(印刷している文字列と常に同じ結果が得られます):

mまたはaの小数部分に何桁印刷する必要がありますか?小数部分を表すには少なくとも1桁必要であり、それを超えると、引数値をfloat型の隣接する値と一意に区別するために必要な桁数だけになります。

0.1fは正確な値に最も近い表現可能なフロートであるため、このタイプ0.1の他の値と一意に区別するためにこれ以上の桁は必要ありませんfloat

于 2012-08-26T09:03:05.240 に答える