浮動小数点数は異なる目的で印刷されるため、異なる方法で印刷されます。
浮動小数点数の出力は変換操作です。内部形式でエンコードされた値は 10 進数に変換されます。ただし、変換の詳細については選択肢があります。
(A)正確な数学を行っていて、内部形式で表される実際の値を確認したい場合、変換は正確でなければなりません: 入力とまったく同じ値を持つ 10 進数を生成する必要があります。(各浮動小数点数は正確に 1 つの数値を表します。IEEE 754 標準で定義されているように、浮動小数点数は間隔を表していません。) 場合によっては、非常に多くの桁数を生成する必要がある場合があります。
(B)正確な値は必要ないが、内部形式と 10 進数を相互に変換する必要がある場合は、他の結果と区別できるように正確に (そして正確に) 10 進数に変換する必要があります。つまり、内部形式で隣接する数値を変換して得られる結果とは異なる結果になるように、十分な桁数を生成する必要があります。これには多数の数字を生成する必要があるかもしれませんが、管理できないほど多くはありません。
(C)読者に数の感覚を与えたいだけで、アプリケーションが必要に応じて機能するために正確な値を生成する必要がない場合は、必要な数の数字のみを生成する必要があります。特定のアプリケーション。
変換を行うには、次のうちどれを行う必要がありますか?
言語が異なれば、異なる目的で開発されたため、または開発中に正確な結果を生成するために必要なすべての作業を行うのが適切ではなかったため、またはその他のさまざまな理由で、異なるデフォルトがあります。
(A) 注意深いコードが必要であり、一部の言語またはその実装では、この動作が提供されていないか、提供されることが保証されていません。
(B) は Java で必須だと思います。ただし、最近の質問で見たように、予期しない動作が発生する可能性があります。(65.12
後者には近くの値と区別するのに十分な桁数があるため、65.12-2
「65.12」と出力されますが、それと 63.12 の間に別の浮動小数点値があるため、「63.120000000000005」と出力されます。 )
(C) は、一部の言語がデフォルトで使用するものです。印刷する桁数の単一の値がすべてのアプリケーションに適しているわけではないため、これは本質的に間違っています。実際、関係する真の値を隠すことによって、浮動小数点数に関する継続的な誤解を助長することを何十年にもわたって見てきました。ただし、実装が簡単なため、一部の実装者にとっては魅力的です。理想的には、言語はデフォルトで浮動小数点数の正しい値を出力する必要があります。より少ない桁数を表示する場合、希望する結果を生成するための適切な桁数を考慮して、アプリケーションの実装者のみが桁数を選択する必要があります。
さらに悪いことに、一部の言語では、実際の値またはそれを区別するのに十分な桁数を表示しないことに加えて、生成された桁数が何らかの意味で正しいことを保証しません (正確な値を数値に丸めて得られる値であるなど)。示されている数字の数)。この動作に関する保証を提供しない実装でプログラミングする場合、エンジニアリングを行っているわけではありません。