2011-06-13 71 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); 
}