Objective C浮点乘法不准确

时间:2012-11-12 16:14:00

标签: xcode xcode4.5 floating-accuracy

我想要做的很简单但结果却出现了错误:

    float x = 423.36;
    NSLog(@"%f", x);
    NSLog(@"%.2f", x*17719);

结果:

2012-11-12 11:19:02.096 test[2917:907] 423.359985
2012-11-12 11:19:02.098 test[2917:907] 7501515.50
  • 第一个问题:在第一个NSLog上,小数部分正在改变, 我怎么能保持它原样?
  • 第二个问题:由于小数改变了乘法 过程导致产品不准确。

使用计算器计算时,我得到:7501515.84,这就是我想在我的应用程序中获得的内容。

有什么想法吗? 提前致谢! 罗伊。

2 个答案:

答案 0 :(得分:3)

  1. 小数更改是因为float类型无法准确表示任意数字。浮点数中有一定数量的精度可用,您需要小心正是你发现的原因:这些数字可以在没有警告的情况下改变你。

  2. 这不是一个真正的问题,但我会尽我所能:我认为你想要做的是找到一种方法来表示任意(或至少更高)的精确十进制数做你的数学。幸运的是,iOS SDK有一个答案:NSDecimalNumber class,它可以让您处理任何可以表示为mantissa * 10 ^ exp的号码,其中mantissa长达38位。仔细查看该类引用,看看是否可以移植现有的数学来使用它。

  3. 当你在这里时,这是阅读The Floating Point Guide的绝佳时机,它会处理你发现的问题。

答案 1 :(得分:2)

不要使用花车,因为它们对每个人都是精确的。使用双打