2012-03-20 91 views
-1

我有一個浮點值,我想顯示它在格式字符串,如果它對應於一個int,顯示整數,如果沒有,顯示它與一位小數。浮點不精確printf/appendFormat

像這樣:

3.1 
3 
2.9 
2.8 

現在我停留在概念,我會做這樣的事情:

float myFloat = 3.1 
float mySecondFloat = 3 
[NSString stringWithFormat:@"%g %g", myFloat, mySecondFloat]; 

我的問題是:

1 /格式「%g」在大多數情況下都適用,但有時我的結果顯示爲「0.600001」,而實際上應該有0.6,因爲我所做的只有0.7 - 0.1。

是否有一種類型的浮點數爲1的小數或可能是一個按位操作來擺脫最後的不精確或其他方式使它在100%的情況下工作?

謝謝您的回答。

+1

你的「現實」不幸的是,它並不符合世界其他地方的現實,特別是與您計算機硬件的實際情況不符:-( – 2012-03-20 20:39:14

+1

您所需的精度總是保持一位小數?如果是這樣,您最好將其存儲爲整數(比你希望的值大10倍),並且有一個打印功能,可以將小數點放在正確的位置,否則,你將遇到無法準確表示爲浮點數的問題(例如,'0.6'你的例子) – 2012-03-20 21:52:04

+0

@KerrekSB你可以將我重定向到一篇文章解釋g爲我的計算機硬件的現實帶來了這個結果。我只是好奇它是如何在幕後工作的。 – moxy 2012-03-21 22:00:26

回答

1

如果您在使用十進制數字時需要絕對精度,則可以考慮使用NSDecimalNumber類。

Number and Value Programming Topics: Using Decimal Numbers

否則,%.1g格式說明會確定。

+0

是的,我已經讀過NSDecimalNumber類在那裏覆蓋浮點數的不精確性。我會試一試。 「%.1g」格式說明符根本無法按預期工作。 – moxy 2012-03-21 06:19:54

1

你必須使用此代碼:

float myFloat = 3.1 
float mySecondFloat = 3 
[NSString stringWithFormat:@"%.1f %.1f", myFloat, mySecondFloat]; 

編輯:

如果我真的想打印一個浮動的整數值,我會做這樣(醜陋的代碼)

int intValue = myFloatNumber/1; 
NSString *string; 
if(myFloatNumber == intValue) 
{ 
    string = [NSString stringWithFormat:@"%.0f", myFloatValue]; 
} 
else 
{ 
    string = [NSString stringWithFormat:@"%.1f", myFloatValue]; 
} 

做一個整數除1,你會自動將你的浮點數轉換爲一個int值。 一旦你有了NSString *字符串,你可以將它連接到你的字符串。

+0

這就是我要做的,如果我沒有任何其他的選擇,但這段代碼將打印出「3.1 3.0」,我會優先顯示「3.1 3」。 – moxy 2012-03-20 20:53:19

+0

我編輯了我的答案,檢查它是否是你想要的:) – Lolloz89 2012-03-20 21:29:28

+0

浮點數除以int產生浮點數;除以1不是導致隱式轉換的原因,它是將它分配給int的事實。 – 2012-03-20 21:49:56

0

看到別人的答案,似乎沒有標準的C格式化程序來實現這一點。

我跟着尼古拉回答(NSDecimalNumber),因此解決標誌。它確實工作得很好,但是,在我的(非常簡單)的情況下,它可能是矯枉過正的。給它一個第二個想法,如果我不得不做一遍,我認爲我會(使用numberWithFloat:法)去一個NSNumber的只使用NSNumberFormatter

如果它可以幫助別人..

+0

我會使用:'[[NSNumber numberWithFloat:myFloat] stringValue];',因爲它會自動處理+/- .00000001。 – lnafziger 2012-04-07 15:21:00