2017-01-04 44 views
1

我注意到一些浮點轉換不同。但是還是不知道爲什麼會發生這種情況?我添加了兩個關於示例代碼的調試模式截圖。示例值:7.37和9.37。遇到它迅速肯定迅速使用IEEE 754 floating point standard請解釋這是怎麼發生的?轉換結果有何不同?爲什麼在浮點轉換中發生這種情況?

if let text = textField.text { 
    if let number = formatter.number(from: text) { 
    return Double(number) 
    } 
    return nil 
} 

enter image description here

enter image description here

+1

浮點數有*有限精度* - 您鏈接的答案的哪一部分不清楚? –

+0

比較http://stackoverflow.com/a/39777334/1187415:根據打印號碼的方式,使用'description'或'debugDescription',並且這兩種方法使用不同的精度來轉換爲字符串。 –

+0

鏈接Q很明顯,但我不明白爲什麼7.37不像9.37那樣收斂?我的意思是7.37從右邊收斂(7.3700000..1),但是9.37從左邊收斂(9.36999..2)。 @ martin-r感謝你的回答,但對我仍然不清楚。我沒有選擇任何不同的精度進行轉換,因爲你在我的評論中解釋了 – yilmazburk

回答

1

Double浮點數存儲在基地-2,並不能代表所有小數完全相同。

在這種情況下,7.37和9.37四捨五入到最接近的浮點數7.37000000000000010658141036401502788066864013671875和9.3699999999999992184029906638897955417633056640625。

當然,這樣的十進制表示對於一般用途來說過於笨拙,所以編程語言通常會打印較短的近似小數表示形式。兩種流行的選擇是

  1. 將進行正確舍入到原來的數目(在這種情況下是7.379.37,分別)最短的字符串。
  2. 取整爲17位有效數字,其中is guaranteed to give the correct value when converting back to binary

這些看起來與您所看到的2個調試輸出值相對應。

相關問題