2012-04-06 40 views
6

我想知道是否有方法可以輕鬆安全地更正浮點數。更正浮點數

例如,

進入時間: 「32 + 32.1」 結果: 「64.0999999999999」

另外不得不提的是該使用科學記數時出現相當頻繁。 「(2.3 * 10^23)*(1.452 * 10^23)」 返回: 「3.339599999999999999e + 46」

最後,有時返回的號碼爲: 離。 123.0000000000001

感謝您的幫助!

編輯

是被批准的答案是偉大的。但是我發現爲我工作的是在NSString stringWithFormat中使用%g和double。 %g似乎將所有事情做得相當恰當。 ex。

answer.text = [NSString [email protected]" %g ", doubleAnswer]; 

通過你的計算使用雙打,然後使用該方法似乎爲我工作,我希望這可以幫助其他人。如果這不是您尋找的答案,請查看獲得批准的答案!

回答

8

浮點數不能很好地表示具體的數字。使用double將會減少這種情況發生,但你仍然會遇到問題。有關如何存儲浮點數的技術說明(以及我們爲什麼首先出現此問題),請參閱此維基百科文章:IEEE 754-1985。 (基本上,浮點數是作爲值的二進制表示形式存儲的,並且只有很多位才能使用,所以它們很快就會用盡,並且必須舍入到它們能夠表示的最近值。)

通常,您不會不用擔心+/- .0000001,只需要用適當數量的小數點將它們顯示給用戶時將其格式化即可,並且它將變爲四捨五入。從內部來看,它的存儲方式並不重要。

舉例來說,如果你想顯示「結果」你可以做這樣的事情:

float myFloat = 32 + 32.1; 
NSString *result = [NSString stringWithFormat:%@"%.2f", myFloat]; 
// result will contain 64.10 

如果你不想小數點固定數量的,你也可以用浮子的字符串NSNumber轉換能力:

float myFloat = 32 + 32.1; 
NSNumber *myNumber = [NSNumber numberWithFloat:myFloat]; 
NSString *result = [myNumber stringValue]; 
// result will contain 64.1 

NSDecimalNumber會照顧所有這一切都爲你,但它一點更多地參與和涉及到更多的開銷,但這裏有一個例子讓你開始:

NSDecimalNumber *num1 = [NSDecimalNumber decimalNumberWithString:@"32"]; 
NSDecimalNumber *num2 = [NSDecimalNumber decimalNumberWithString:@"32.1"]; 
// Or since you use exponents: 
// NSDecimalNumber *num2 = [NSDecimalNumber decimalNumberWithMantissa:321 exponent:-1 isNegative:NO]; 

NSDecimalNumber *myNumber = [num1 decimalNumberByAdding:num2]; 
NSString *result = [myNumber stringValue]; 
// result will contain 64.1 
+1

ahh true true,但是如果我想將其顯示爲62.1,但仍然有可能顯示64.1065(例如,我正在尋找btw,謝謝。) – 2012-04-06 21:46:52

+1

然後,您或者需要跟蹤你想要顯示的小數(雜亂)或不使用float並移動到另一種類型的變量(可能是'NSDecimalNumber')。 – lnafziger 2012-04-06 21:48:42

+1

我會試試看。 – 2012-04-06 21:50:44

2

你不能「更正」浮點數,因爲浮點數不能代表你想要的數字。

浮點數非常不精確,通常不應該用於涉及大量計算的任何事情,因爲累積誤差通常是災難性的不好的。使用double代替。它們可以代表更大範圍的值,因此可以非常精確地表示更多的值。如果這不夠好,你需要更精確地轉向某種東西。可能NSDecimalNumber