0

简化问题:

我有一个 float 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

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

4

3 回答 3

1

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

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

于 2013-02-21T04:37:24.263 回答
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)
于 2013-02-21T04:53:08.147 回答
0

这可能会有所帮助:

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

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

于 2013-02-21T04:53:21.697 回答