2011-06-13 56 views
3

我将计算结果舍入到两位小数时遇到问题。使用舍入浮点数的目标C问题

这是一个财务计算,当结果涉及半分钱时,我希望这个数字被四舍五入,但实际上它正在向下舍入。

复制问题:

float raw = 16.695; 
NSLog(@"All DP: %f",raw); 
NSLog(@"2 DP: %.2f",raw); 

返回:

All DP: 16.695000 
2 DP: 16.69 

而我希望看到:

All DP: 16.695000 
2 DP: 16.70 

任何人都可以提出建议,如果这是由设计,或者如果(最有可能的)我错过了一些东西,如果有什么我可以做的来解决它。在这种情况下,它是至关重要的。

由于提前, 奥利

+1

尝试的NSLog(@ “9 DP:%.9f”,生);你会得到:16.694999695 – Felix 2011-06-13 17:12:51

+1

如果你使用双精度,它会在你的例子中取整 – Felix 2011-06-13 17:15:25

+0

好吧,这样的工作,但出于兴趣,为什么?为什么它没有按照设定的16.695存储号码? – faroligo 2011-06-13 17:32:35

回答

8

Don't use floats for financial calculations!

有漂浮cannot represent exactly值。 16.695就是其中之一。当您尝试将该值存储在浮点数中时,实际上会得到最接近的可表示值。当您对浮动执行一系列操作时,您can lose precision,然后您失去准确性。这导致赔钱。

使用的实际货币类型,使用NSDecimalNumber,或做int是你所有的计算方法,算你关心的最小单位(即1050为$ 10.50在整个美分,或$ 1.050,如果你想便士的分数)。

+0

+1仅用于*正确答案 – Abizern 2011-06-13 18:19:52

+0

+1我不敢相信花了将近一个小时的时间才有人提到这个... – 2011-06-13 18:20:52

+0

我相信这种风格的帖子被称为[“bbum”](http:// stackoverflow.com/questions/3730804/how-many-times-do-i-release-an-allocated-or-retained-object/3730835#3730835),我听说他们正在考虑将它添加到SO作为格式化标签:''。 – 2011-06-13 18:21:40

3

据我所知的NSLog()功能只格式化参数,并没有试图圆。

您可能会习惯使用支持舍入的printf()样式函数。

我建议使用math.h中的许多功能之一在输出前四舍五入您的值,并仅依靠NSLog()进行格式设置。

+0

谢谢,但NSLog只是为了这个例子 - 在我正在使用的实际应用程序[NSString stringWithFormat:@“%。2f,xxx]。我被引导认为这和printf()一样做了四舍五入。你建议什么功能? – faroligo 2011-06-13 17:23:30

0

看到评论

使用标准C函数族轮()之后。 roundf()浮子,圆()双,roundl()长双。然后,您可以将结果强制转换为整数类型您所选择的

-1

你可以试试这个:

- (void)testNSlogMethod { 

    float value = 16.695; //--16.70 
    value = value *100; 

    int mulitpler = round(value); 

    NSLog(@"%.2f",mulitpler/100.0f); 
}