将十进制转换为双精度(目标C)

时间:2018-08-30 14:01:46

标签: objective-c nsdecimalnumber

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时结果不同。为什么精度会有所不同?

我想念什么?

2 个答案:

答案 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,因此感谢您为我提供一些新知识。 :-)