【问题标题】:Rounding a float in c / objective-c. Errors when the last digit is a 5在 c / objective-c 中舍入浮点数。最后一位为 5 时出错
【发布时间】:2013-02-21 04:28:40
【问题描述】:

简化问题:

我有一个浮点数 0.02275,当我将它四舍五入到小数点后 4 位时,而不是预期的 0.0228 我得到 0.0227。我知道这是因为 0.02275 的浮点值类似于 0.0227499999999999...,当四舍五入到小数点后 4 位时得到 0.0227。

float a = 0.02275;
NSLog(@"float a is %f",a);
NSLog(@"float a, rounded to 4 decimal places is %0.4f",a);
NSLog(@"float a, rounded to 10 decimal places is %0.10f",a);

给出输出

float a is 0.022750
float a, rounded to 4 decimal places is 0.0227
float a, rounded to 10 decimal places is 0.0227499995

我的问题是:如何正确舍入以得到 0.0228 而不是 0.0227?

真实情况的局限性:

浮点数取自 plist 文件;将NSNumber floatValue 分配给变量a 时使用。

我的程序是处理金钱和百分比。货币价值是用户输入的,百分比是固定的,或者是用户输入的。上例中的浮点数是导致我的计算不准确的百分比值之一。

【问题讨论】:

  • 如果不能改变变量赋值,能不能把plist文件中的值改高一点,让内部表示落在0.02275的“右边” ?这是一个狡猾的黑客,但它可能会满足您的需求。
  • 尝试使用NSDecimalNumber,因为您正在处理金钱问题。

标签: objective-c c cocoa-touch floating-point currency


【解决方案1】:

不要使用浮点数来存储货币值。错误会不断增加,这对于金钱来说通常是不可取的。将钱以整数形式存储为美分(如果可以有小数美分,则为十分之一美分......)。还将百分比存储为整数,例如 100%=1000 或任何您想要的精度。

例子:

$10 * 105% (logical)
= 1000 * 1050 (variable values)
= 1050000 (intermediate result)
/ 1000 (divide by numeric value of 100%)
= 1050 (final cent value)
= (double)1050/100.0 (C code to get dollars as double for printing)

【讨论】:

  • 谢谢。我怀疑我可能需要这样做。只是希望我没有。
【解决方案2】:

格式运算符截断;它不圆。

有关详细信息,请参阅 printf 的文档。 %.4f 确实四舍五入,但 0.02775 向下舍入为 0.0277,这就是您所看到的。我相信 0.027751 会给你你期望的 0.0278。

【讨论】:

  • 我相信是roundf()。
  • 您确定格式运算符会截断吗? float w = 8.8888; NSLog(@"w to 2dp is %0.2f",w); 输出 w to 2dp is 8.89
  • 我的错误:%.nf 确实是圆的。上面编辑;我的错。
【解决方案3】:

这可能会有所帮助:

http://www.accuretech.com/ios-app-development-rounding-number-tips/

它还提供了一些其他信息,但总体上应该可以帮助您获得所需的信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 2015-09-07
    相关资源
    最近更新 更多