doubleValue不会始终正确地将对象转换为double值

我有一个NSArray,我想在其中存储双值。 我把它定义如下

NSMutableArray *setOfDoubles; 

我添加如下元素

 NSNumber *num; num = [NSNumber numberWithDouble:someDouble]; [setOfDoubles addObject:num]; 

我读了这个元素如下

 num = [setOfDoubles lastObject]; [setOfDoubles removeLastObject]; doubleValueToUse = [num doubleValue]; 

我的问题有时(并非总是),例如当num(作为对象)为5.1时,doubleValueToUse(作为double值)为5.099999999999996。 我认为num(作为一个对象)是5.1的方式是我调试,当我将鼠标hover在行数num = [setOfDoubles lastObject]上的num之上时; 它显示5.1但在doubleValue转换后它变成我提到的数字。 有人知道为什么会这样吗?

并非每个数字都可以使用float变量准确表示。 例如,你不能使用我们的公共十进制(base-10)系统中的有限位数来精确地表示1/3,但在三元(base-3)中,它只是0.1。 类似地,您可以使用十进制有限位数写入的数字可能不一定在其二进制表示中具有有限的位数,因此错误。

如果您感兴趣,请关注该主题的一些链接:

http://floating-point-gui.de/basic/

http://www.mathworks.com/support/tech-notes/1100/1108.html

http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html

这对float值来说是正常的。

如果要在代码的所有位置保存float初始(相同)表示,可以将它们保存在NSString 。 当你需要浮点数时,你只需要写[NSString floatValue]; 。 但是如果你有大量的float值,它就无效了。