2011-11-22 102 views
2

可能重复:
Why can't decimal numbers be represented exactly in binary?精度双Objective-C中的

当我输入0.1作为双值,所述编译器在它的末尾添加一个微小的值,是造成其他计算在我正在运行的程序中出错。我的代码只是说:

double temp = 0.1; 

而且我得到这个变量观众: http://img.skitch.com/20111122-nnrcgi4dtteg8aa3e8926r3fd4.jpg

有谁知道为什么发生这种情况?

由于

+0

重复许多许多问题;我选择了一个,但如果有人能找到更好的,那也是一样。 –

+0

一个有用的链接(但不是一个有用的答案):http://floating-point-gui.de/ – FogleBird

回答

11

double是浮动二进制点类型。在二进制中,“一半”的值是0.1,“四分之一”的值是0.01等。在有限二进制表示中,没有任何方法可以完全代表“十分之一”代表十进制中的“三分之一”。编译器正在为您提供最接近的值,其值为实际上要求的值。

如果您想精确地存储十进制值,因为您关心小数(例如对于当前值),您应该使用基于十进制的类型,如NSDecimalNumber或适当缩放的整数(例如,将15存储为15美分而不是0.15美元)。

我在.NET上binarydecimal浮点文章 - NSDecimalNumber在Objective-C是在C#中略有不同,decimal(请参阅文档),但希望这些文章将会给你多一点见识到了什么是真正发生。

编辑:如注释中所述,通常十进制浮点类型明显比二进制浮点类型慢,部分原因是它们通常较大,部分原因是它们没有CPU支持。如果你有一个硬性能要求你想要精确保留数字,“整数和隐含的比例”选项通常是一个好的选择,尽管编码很麻烦,因为每次阅读时需要考虑它代码:)

+0

是的,有。它是NSDecimalNumber类。 –

+0

@LuizCarlosQuerinoFilho:谢谢,我会做相应的调整。 –

+1

很高兴在目标C帖子上看到J.Skeet,一如既往的完美答案,只是希望强调NSDecimalNumber相比于C double的性能缺陷,如果需要大量操作的话。 – jbat100