Possible Duplicate:
Why can't decimal numbers be represented exactly in binary?
当我输入 0.1 作为 double 值时,编译器会在它的末尾添加一个微小的值,这会导致我正在运行的程序中的其他计算出错。我的代码简单地说:
double temp = 0.1;
我在变量查看器中得到了这个:
http://img.skitch.com/20111122-nnrcgi4dtteg8aa3e8926r3fd4.jpg
有人知道为什么会这样吗?
谢谢
double
是一种 float 二进制 点类型。在二进制中,“二分之一”的值是 0.1,“四分之一”的值是 0.01 等等。在有限的二进制表示中没有办法准确表示“十分之一”,任何比您可以精确表示十进制的“三分之一”还要多。编译器会为您提供最接近您实际要求的值。
如果因为关心小数(例如电流)而想要精确地存储小数值,则应该使用基于小数的类型,例如 NSDecimalNumber
,或适当缩放的整数(例如,存储 15 表示 15 美分而不是 0.15 美元)。
我在 binary 上有文章和 decimal .NET 中的 float - Objective-C 中的 NSDecimalNumber
与 C# 中的 decimal
略有不同(请参阅文档),但希望这些文章能让您更深入地了解实际发生了什么。
编辑:如评论中所述,十进制浮点类型通常比二进制浮点类型慢得多,部分原因是它们通常更大,部分原因是它们没有 CPU 支持。如果您有严格的性能要求并且您希望精确地保留数字,“整数和隐含比例”选项通常是一个不错的选择,尽管编码起来很痛苦,因为您需要考虑到它每次你阅读代码时:)