將 float 基元轉換為 Double 基元可能會導致明顯的精確度損失。這種現象通常歸因於 double 的「額外」精確度,但實際上是由於 float 準確表示某些數字的能力有限。
在下面的範例中,將float 轉換為double 會導致引入數字:
float temp = 14009.35F; System.out.println(Float.toString(temp)); // 14009.35 System.out.println(Double.toString((double)temp)); // 14009.349609375
一種解法是將float 轉換為字元串,然後將字串解析為double,這樣會保留原始值:
System.out.println(Double.toString(Double.parseDouble(Float.toString(temp)))); // 14009.35
需要注意的是,「額外」數字實際上並不是由double 原語添加的。浮點數根本不能準確地表示數字。雙精度值忠實地表示原始浮點值。
轉換為字串並傳回結果會產生更接近字串表示形式的雙精確值,但重要的是要驗證這是否確實是所需的。
在需要精確小數值的情況下(例如貨幣計算),請考慮使用BigDecimal 類型而不是float 或double,因為它可以確保更準確地表示十進制數字。
以上是為什麼將浮點型轉換為雙精度有時會失去精度?的詳細內容。更多資訊請關注PHP中文網其他相關文章!