1

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

    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,这就是我想在我的应用程序中得到的。

有任何想法吗 ?提前致谢!罗伊。

4

2 回答 2

3
  1. 小数点会发生变化,因为float类型不能准确地表示任意数字。在浮点数中,您可以使用有限的精度,并且您需要小心您发现的确切原因:这些数字可能会在没有警告的情况下在您身上发生变化。

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

当您阅读时,这将是阅读The Floating Point Guide的绝佳时机,该指南处理您发现的问题。

于 2012-11-12T16:26:58.477 回答
2

不要使用浮点数,因为它们对每个人都不精确。使用双打

于 2012-11-12T16:27:07.937 回答