可能重复:
Why can't decimal numbers be represented exactly in binary?
当我输入0.1作为double值时,编译器会在其末尾添加一个微小的值,导致其他计算在我正在运行的程序中出错。我的代码简单地说:
double temp = 0.1;
我在变量查看器中得到了这个: http://img.skitch.com/20111122-nnrcgi4dtteg8aa3e8926r3fd4.jpg
有谁知道为什么会这样?
由于
答案 0 :(得分:11)
double
是浮点二进制点类型。在二进制中,“a half”的值为0.1,“a quarter”的值为0.01等。完全无法在有限二进制表示中表示“十分之一”,任何超过你可以完全代表十进制的“第三个”。编译器为您提供了与实际要求的值最接近的值。
如果你想精确地存储十进制值,因为你关心小数(例如当前)你应该使用基于十进制的类型,如NSDecimalNumber
,或适当缩放的整数(例如存储15 15美分)而不是0.15美元)。
我在.NET上有binary和decimal浮点文章 - Objective-C中的NSDecimalNumber
与C#中的decimal
略有不同(参见文档),但希望这些文章能让你更深入地了解实际发生的事情。