【问题标题】:Accuracy of double Objective-C [duplicate]双Objective-C的准确性[重复]
【发布时间】:2012-01-04 05:27:50
【问题描述】:

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

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

double temp = 0.1;

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

有人知道为什么会这样吗?

谢谢

【问题讨论】:

  • 很多很多问题的重复;我选了一个,但如果有人能找到更好的,那就太好了。
  • 一个有用的链接(但不是一个有用的 SO 答案):floating-point-gui.de

标签: objective-c


【解决方案1】:

double 是浮点型二进制。在二进制中,“半”的值是 0.1,“四分之一”的值是 0.01 等等。没有办法准确在有限的二进制表示中表示“十分之一”,任何超过你可以用十进制精确表示“三分之一”。编译器会为您提供与您实际要求的值最接近的值。

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

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

编辑:如 cmets 中所述,十进制浮点类型通常比二进制浮点类型慢得多,部分原因是它们通常更大,部分原因是它们没有 CPU 支持。如果您有严格的性能要求并且您想精确地保留数字,“整数和隐含比例”选项通常是一个不错的选择,尽管您需要考虑到编码时会很痛苦每次阅读代码时:)

【讨论】:

  • 是的,有。它是 NSDecimalNumber 类。
  • @LuizCarlosQuerinoFilho:谢谢,我会相应调整。
  • 很高兴看到 J.Skeet 在客观 C 帖子上,一如既往的完美答案,只是想强调 NSDecimalNumber 与 C double 相比的性能缺点,如果需要大量操作。
  • @jbat100:会提到这一点。通常在重要的地方,慢点总比错误好:)
  • +1,但是“十进制浮点类型明显慢于十进制浮点类型”是什么意思?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
  • 2011-01-16
  • 2012-05-25
  • 2013-10-30
  • 2012-07-12
  • 2012-06-23
  • 1970-01-01
相关资源
最近更新 更多