Xcode 目标C浮点乘法不准确性

Xcode 目标C浮点乘法不准确性,xcode,xcode4.5,floating-accuracy,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上,小数部分正在更改, 我怎样才能保持原样? 第二个问题:因为小数改变

我尝试做的很简单,但结果却出现了一个错误:

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

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

小数会发生变化,因为浮点类型不能准确表示任意数字。浮点数的精度是有限的,你需要注意你发现的确切原因:这些数字可能会在没有警告的情况下改变

这不是一个真正的问题,但我会尽我最大的努力:我想你要做的是找到一种方法来表示任意的——或者至少更高精度的十进制数来做你的数学计算。幸运的是,iOS SDK有一个答案:的,它允许您处理任何可以表示为尾数*10^exp的数字,其中尾数最长为38位。查看该类引用,看看是否可以移植现有的数学来使用它

当你这样做的时候,这将是一个很好的阅读时间,它处理的问题就像你发现的一样

小数会发生变化,因为浮点类型不能准确表示任意数字。浮点数的精度是有限的,你需要注意你发现的确切原因:这些数字可能会在没有警告的情况下改变

这不是一个真正的问题,但我会尽我最大的努力:我想你要做的是找到一种方法来表示任意的——或者至少更高精度的十进制数来做你的数学计算。幸运的是,iOS SDK有一个答案:的,它允许您处理任何可以表示为尾数*10^exp的数字,其中尾数最长为38位。查看该类引用,看看是否可以移植现有的数学来使用它


当你在做这件事的时候,这将是一个很好的阅读时间,它会处理像你发现的那样的问题。

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

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

这只是推迟了问题的解决-请在将x转换为双精度后尝试NSLog@%.100f,x。您将看到类似的错误在小数点后大约14位出现。@tim确定在某些情况下双精度也是不正确的,但对于给定的示例,使用NSDecimalNumber类而不是基元类型就像“使用大锤敲开螺母”。这只是推迟了问题的发生-尝试NSLog@%.100f,将x转换为双精度后的x。你会看到同样的错误在小数点后14位出现。@tim当然在某些情况下双精度也是不正确的,但是对于给定的示例,在我看来,使用NSDecimalNumber类而不是基元类型就像“用大锤敲开螺母”。对我来说,这是一点点开销,我必须说,对我来说,这是一点点开销,我必须说