2012-06-22 69 views
0

我有一個有趣的鍛鍊現狀來解決,它更像是一個測驗:)Objc數學小數

我不得不重新創建一個簡單的計算器,我有兩個按鈕上/下就可以了。 這兩個按鈕的功能是simpe,它們取當前值,它總計爲1或 取1.因此,我設法創建一個將該值轉換爲字符串的小函數,在34.1的情況下,創建新值的0.1來加或減。

- (float)findFloatValueToAdd:(NSString *)aString 
{ 
    NSMutableString *val = [NSMutableString stringWithCapacity:aString.length]; 

    for (int i = 0; i < aString.length; i++) 
    [val appendFormat:@"0"]; 

    if ([aString rangeOfString:@"."].location != NSNotFound) 
    [val replaceCharactersInRange:NSMakeRange([aString rangeOfString:@"."].location, 1) 
         withString:@"."]; 

    [val replaceCharactersInRange:NSMakeRange(aString.length-1, 1) 
        withString:@"1"]; 

    return [val floatValue]; 
} 

主要問題是當我有很多小數如23.1234212。如果我必須上漲,那麼直接跳到23.12342,也是如此。如果我繼續從23.12342下降,它會降至23.12341> 23.1234,但隨後會降至23.1233> 23.1232> 23.1231 ...

那麼,我該如何真正解決這個問題呢?

謝謝你們!

+0

我不太明白這個問題。你是說你想跟蹤原來的小數位數嗎?另外,這功課呢? – sblom

+1

我並不真正理解這個問題。你說你想總結1或者取1,然後你說你正在給你的號碼加上.1。你能列出一些正在發生什麼和應該發生什麼的具體情況嗎? – Dima

回答

1

作爲一個評論說,這聽起來有點像功課...兩種思路供您探討:

1)你是如何顯示的結果呢?如果你不知道像%5.2f這樣的格式是什麼意思,那就查找 - 查找格式規範。這可能解釋明顯的截斷,但是...

做你想要的東西是棘手的使用數字。與數學不同的是,計算機使用基2算術運算並且浮點的精確數位範圍有限。如果沒有意義考慮分數1/3,它的十進制表示是什麼? 0.333333333廣告nasuem。一個表示中的值在另一個表示中可能沒有完全相同的值,這對於您寫入的十進制數和計算機的二進制浮點表示形式而言是相同的。因此:

2)您的代碼以字符串開頭表示浮點數,該浮點數似乎僅限於數字和小數點 - 即無指數。然後,您創建一個字符串您想要添加的數字。然後你轉換爲浮點數,並且事情開始出錯。爲什麼要轉換爲浮點?你可以用字符串來做到這一點。從最後一個字符(最右邊)開始,查找它並「添加」一個 - 所以如果它是'1',您想要一個'2',如果該字符是'9',那麼您需要一個'0',並且「carry」爲1.現在轉到下一個字符...

+0

這不是作業,它是一個真正的項目。 我的客戶希望使用自定義計算器,所以我創建了一個自定義鍵盤,並在其中靠近常規的0> 9按鈕的上/下按鈕。這個上/下需要做的是添加或刪除1,但是,這是棘手的,我們可以有一個非常容易的整數,但也浮點數如23.32134。 因此,在這種情況下,我應該添加/子0.00001。第一次是好的,但不幸的是,當我讀到23.32130(最後一個零不會顯示)時,我必須下降到23.32129,實際上它不會去,它會到23.3212(從23.3213)。 – DigitalVanilla

+0

@DigitalVanilla - 我建議你去* string *路線。您可以將字符串中的「數字」保存爲字符串,並在用戶點擊按鍵時將其編碼。上/下使用上面(2)中的算法。在進行更復雜的數學計算時,您只需要轉換爲數字,那麼'NSDecimalNumber'可能就是要走的路 - 取決於您需要支持哪些數學運算以及您準備做多少編碼。 * [最初的計算器,有些可能還是這樣,以BCD存儲數字,這很容易顯示和開發用於數學的BCD算法 - 查找CORDIC。] * – CRD

+0

非常感謝!我會發布我的最終方法,以便我可以分享以防別人需要它。 – DigitalVanilla