双重Objective-C的准确性

时间:2011-11-22 20:32:30

标签: objective-c

  

可能重复:
  Why can't decimal numbers be represented exactly in binary?

当我输入0.1作为double值时,编译器会在其末尾添加一个微小的值,导致其他计算在我正在运行的程序中出错。我的代码简单地说:

double temp = 0.1;

我在变量查看器中得到了这个: http://img.skitch.com/20111122-nnrcgi4dtteg8aa3e8926r3fd4.jpg

有谁知道为什么会这样?

由于

1 个答案:

答案 0 :(得分:11)

double是浮点二进制点类型。在二进制中,“a half”的值为0.1,“a quarter”的值为0.01等。完全无法在有限二进制表示中表示“十分之一”,任何超过你可以完全代表十进制的“第三个”。编译器为您提供了与实际要求的值最接近的值。

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

我在.NET上有binarydecimal浮点文章 - Objective-C中的NSDecimalNumber与C#中的decimal略有不同(参见文档),但希望这些文章能让你更深入地了解实际发生的事情。

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