为什么在浮点转换中发生这种情况?
问题描述:
我注意到一些浮点转换不同。但是还是不知道为什么会发生这种情况?我添加了两个关于示例代码的调试模式截图。示例值: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
}
答
Double
浮点数存储在基地-2,并不能代表所有小数完全相同。
在这种情况下,7.37和9.37四舍五入到最接近的浮点数7.37000000000000010658141036401502788066864013671875和9.3699999999999992184029906638897955417633056640625。
当然,这样的十进制表示对于一般用途来说过于笨拙,所以编程语言通常会打印较短的近似小数表示形式。两种流行的选择是
- 将进行正确舍入到原来的数目(在这种情况下是
7.37
和9.37
,分别)最短的字符串。 - 取整为17位有效数字,其中is guaranteed to give the correct value when converting back to binary。
这些看起来与您所看到的2个调试输出值相对应。
浮点数有*有限精度* - 您链接的答案的哪一部分不清楚? –
比较http://*.com/a/39777334/1187415:根据打印号码的方式,使用'description'或'debugDescription',并且这两种方法使用不同的精度来转换为字符串。 –
链接Q很明显,但我不明白为什么7.37不像9.37那样收敛?我的意思是7.37从右边收敛(7.3700000..1),但是9.37从左边收敛(9.36999..2)。 @ martin-r感谢你的回答,但对我仍然不清楚。我没有选择任何不同的精度进行转换,因为你在我的评论中解释了 – yilmazburk