objective-c - 双Objective-C的精度

标签 objective-c

<分区>

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 支持。如果您有严格的性能要求并且您希望精确地保留数字,“整数和隐含比例”选项通常是一个不错的选择,尽管编码起来很痛苦,因为您需要考虑到它每次你阅读代码时:)

关于objective-c - 双Objective-C的精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8233424/

相关文章:

ios - 枚举对象并将其添加到 NSMutableSet 时的 exc_bad_access

ios - transitionWithView 不执行翻转动画

ios - iPhone/iPad iOS7 中的设备方向问题

ios - 在两个 View Controller Swift IOS 之间传递数据

iphone - 奇怪的图标行为

iphone - map View 崩溃时的 GDirections 路线

ios - ComponentKit 如何推送 View Controller CKComponentController

objective-c - 格式字符串不是字符串文字(可能不安全)

ios - 在“id<NSCopy>”类型的对象上找不到读取字典元素的预期方法

iphone - 向下移动 UITabBarItem 图像?