【问题标题】:Objective C float multiplication inaccuracyObjective C浮点乘法不准确
【发布时间】:2012-11-12 16:13:59
【问题描述】:

我想做的很简单,但结果却报错:

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

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

【问题讨论】:

    标签: xcode xcode4.5 floating-accuracy


    【解决方案1】:
    1. 由于float 类型无法准确表示任意数字,因此小数会发生变化。浮点数的精度是有限的,您需要小心您发现的原因:这些数字可能会在您没有任何警告的情况下发生变化。

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

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

    【讨论】:

    • 对我来说似乎有点开销,我必须说
    【解决方案2】:

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

    【讨论】:

    • 这只是推迟问题 - 在将 x 转换为双精度后尝试 NSLog(@"%.100f", x)。您会在小数点后大约 14 位看到相同类型的错误。
    • @tim 当然在某些时候双精度也是不精确的,但是对于给定的示例,使用 NSDecimalNumber class 而不是原始类型就像“使用大锤破解坚果'IMO。
    猜你喜欢
    • 2017-06-27
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 2011-05-06
    • 2015-09-07
    相关资源
    最近更新 更多