可能重复:
为什么十进制数不能用二进制表示?
当我输入0.1作为double值时,编译器会在其末尾添加一个微小的值,导致其他计算在我正在运行的程序中出错.我的代码简单地说:
double temp = 0.1;
Run Code Online (Sandbox Code Playgroud)
我在变量查看器中得到了这个:http: //img.skitch.com/20111122-nnrcgi4dtteg8aa3e8926r3fd4.jpg
有谁知道为什么会这样?
谢谢
Jon*_*eet 11
double是浮点二进制点类型.在二进制中,"一半"的值是0.1,"四分之一"的值是0.01等.没有办法在有限二进制表示中精确表示"十分之一",不能超过你可以精确表示"第三个"十进制".编译器会为您提供与您实际要求的值最接近的值.
如果你想精确地存储十进制值因为你关心小数(例如当前)你应该使用基于十进制的类型NSDecimalNumber,或者适当缩放的整数(例如,存储15代表15美分而不是0.15美元).
我在.NET中有关于二进制和十进制浮点的文章- NSDecimalNumber在Objective-C中与decimalC#略有不同(参见文档),但希望这些文章能让你更深入地了解实际发生的事情.
编辑:如注释中所述,通常十进制浮点类型明显慢于二进制浮点类型,部分原因是它们通常更大,部分原因是它们没有CPU支持.如果你有一个硬性能要求并且你想要精确地保留数字,那么"整数和隐含比例"选项通常是一个很好的选项,尽管每次阅读代码时都需要考虑它,因此很难对代码进行编码: )
| 归档时间: |
|
| 查看次数: |
1092 次 |
| 最近记录: |