2010-11-03 139 views
1

當前,用字符串@"9999999999999999"創建的[NSDecimalNumber longLongValue]返回10000000000000000將「NSDecimalNumber」轉換爲「SInt64」而不會丟失精確度。 (在SInt64,iOS的範圍內)

這意味着該類轉換它的價值double第一,並重新轉換成SInt64signed long long

如何規避這種行爲?我想要在SInt64範圍內得到精確的整數。

PS。 我考慮轉換爲NSString並重新轉換爲SInt64NSScannerstrtoll,但我相信有更好的方法。但如果你確定沒有別的辦法,請告訴我。

回答

0

首先:除非您確定它對性能至關重要,否則我會將它寫入字符串並將其掃描回去。這是簡單的方法。現在

,如果你真的想這樣做,否則:

  1. NSDecimalNumber
  2. 與結構的私有領域的工作得到了NSDecimal,初始化從尾數您long long值(可能引入檢查以處理太大的mantissas)
  3. 乘以10 ^指數;你可以使用binary exponentiation來做到這一點;再次檢查溢出
+0

感謝您的回答! #2似乎比#1更快。然而,#1是更好的方式,因爲你提到:) – Eonil 2010-11-09 04:49:42

0

從NSDecimalNumber * originalValue開始。

讓int64_t大約= [originalValue longLongValue]。這不會是確切的,但非常接近。

將大約轉換爲NSDecimalNumber,計算originalValue - approx,取longLongValue,並加上大約。現在你得到了正確的結果。

相關問題