簡體   English   中英

java float轉換為字符串給出不同的結果

[英]java float conversion to string giving different result

為什么下面的java代碼打印相同浮點變量的不同值(小數部分)?

public static void main(String[] args) {
    float f = 2001797.11f;
    System.out.println(String.format("%013.2f", f));
    System.out.println(Float.toString(f));
    System.out.println(String.format("%018.5f", f));
}

輸出:

0002001797.13
2001797.1
000002001797.12500

混亂源於float f = 2001797.11f;float f = 2001797.11f; 最接近數學值"2001797.11" float實際上是2001797.125 你可以這樣看

System.out.println(new BigDecimal(2001797.11f));

因此, f實際上是2001797.125並且String.format的2次使用已正確舍入。

那么為什么Float.toString(f)不會產生"2001797.125" 這是因為Float.toString只顯示足夠的小數位數,以便將值與其他float值區分開來。 在這種情況下,只顯示小數位后的1

您必須考慮floatdouble類型處理浮點數 :這意味着它們必須在整數和小數部分之間分配32位或64位。

所以:整數部分中的最多位數,大多數位將專用於它們,小數部分的位數越少。 因此,小數部分將不太准確

你遇到的問題來自兩個事實:

  • 整數部分中的位數太多。
  • 使用浮動。

如果您需要更多精確度(根據程序必須處理的值的大小),您應該遷移到double 如果你想要無限期,那就是BigDecimal

String.format使用顯式格式規則,而Float.toString(float n)使用文檔中描述的算法: http//docs.oracle.com/javase/7/docs/api/java/lang/Float.html#的toString(浮點)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM