为什么在浮点转换中发生这种情况?

问题描述:

我注意到一些浮点转换不同。但是还是不知道为什么会发生这种情况?我添加了两个关于示例代码的调试模式截图。示例值: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://*.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

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个调试输出值相对应。