Float を Double に変換する際の精度の維持
プリミティブ 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
精度の不一致を理解する
精度の見かけの向上は本物ではないことに注意することが重要です。 float は当初意図した数値を正確に表していませんでした。変換された double は float の元の値を正確に反映しますが、toString() は常に存在していながら隠されていた「余分な」精度を明らかにします。
たとえば、次の架空のシナリオを考えてみましょう:
float f = 0.1F; double d = f;
この場合、f の値は正確に 0.100000234523 になる可能性があります。 d は同じ値を保持しますが、文字列に変換すると、より高い精度が想定され、すでに存在していた追加の数字が表示されます。
回避策としての文字列変換
文字列に変換してから戻すと、元の float よりも意図した数値に近い double 値が得られる可能性がありますが、この回避策は、文字列値が目的の数値を正確に表す場合にのみ有効です。
代替データ型に関する考慮事項
ユーザーは、float/double が自分のユースケースに適しているかどうかを評価する必要があります。正確な 10 進数値が必要な場合 (財務計算など)、BigDecimal の方がより適切なデータ型になる可能性があります。
以上がfloat を double に変換すると精度の問題が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。