Float を Double に変換する際の精度の維持
特定のシナリオでは、単に float を double にキャストすると、一見不正確な精度が発生する可能性があります。この予期しない動作は、double の精度が向上したためではなく、float の精度が意図した値を正確に反映していないためです。
この概念を理解するには、次の例を考えてください。
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 の文字列表現は float に格納されている値を正確に表示します。この違いは、float の内部値が実際には 14009.35 ではなく、14009.349609375 に近かったために発生します。 float を double にキャストすることは、単に基礎となる精度を公開するだけです。
文字列に変換して元に戻すことは、必要な精度を維持しているように見えるため、実行可能な解決策のように思えるかもしれません。
System.out.println(Double.toString(Double.parseDouble(Float.toString(temp)))); // Prints 14009.35
ただし、このアプローチでは潜在的な問題が発生します。文字列表現が真に正確でない場合、結果として得られる double は、精度が異なっていても不正確になります。
したがって、特定の数値要件に対して float と double を使用することが適切かどうかを評価することが重要です。正確な 10 進数値が必要な場合には、BigDecimal の方が適切な選択肢となる可能性があります。 BigDecimal では任意の精度が可能で、float および double 表現の制限による潜在的な落とし穴が排除されます。
以上がフロートをダブルにキャストすると精度が低下するように見えるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。