XCode 9.4.1。在调试器控制台中,我看到的结果对我来说似乎很奇怪:
(lldb) print (double)0.07
(double) $0 = 0.070000000000000007
(lldb) print [(NSDecimalNumber*)[NSDecimalNumber decimalNumberWithString:@"0.07"] doubleValue]
(double) $1 = 0.069999999999999993
如果在编译代码中执行,我看到的结果相同。我不明白为什么将文字0.07转换为double以及将十进制0.07转换为double时结果不同。为什么精度会有所不同?
我想念什么?
答案 0 :(得分:1)
值的计算方式不同
(lldb) p 7.0 / 100.0
(double) $0 = 0.070000000000000007
(lldb) p 7.0 / 10.0 / 10.0
(double) $1 = 0.069999999999999993
答案 1 :(得分:0)
NSDecimalNumber
的设计行为与您所看到的完全一样。它执行“以10为基数的数学运算”来避免出现您遇到的问题-传统的数字浮点表示法不能准确地表示我们用来编写的以10为基数的数字。
指导您“研究数值方法”的评论有些粗鲁,但朝着正确的方向发展。更好地利用您的时间可以(同时)查看NSDecimalNumber
的文档,并考虑它的作用及其存在的原因。
几分钟前我从未听说过NSDecimalNumber
,因此感谢您为我提供一些新知识。 :-)