2016-01-14 76 views
0

我有一個用例,我想確定一個NSDecimalNumber在swift中是否有小數部分(0除外)。我可以截斷小數部分,但涉及到創建一個新的NSDecimalNumber,如果可能,我想避免這種情況。NSDecimalNumber如何確定是否有一個小數部分

我在計算屬性中這樣做,所以我希望它儘可能高效。這是目前我什麼擴展看起來像一個遊樂場:

extension NSDecimalNumber { 
    func decimalNumberRoundedToDigits(withDecimals: UInt8, roundingMode: NSRoundingMode = NSRoundingMode.RoundPlain) -> NSDecimalNumber 
    { 
     // round to required decimals 
     let disp = decimalNumberByRoundingAccordingToBehavior(NSDecimalNumberHandler(roundingMode: roundingMode, scale: Int16(withDecimals), raiseOnExactness: false, raiseOnOverflow: false, raiseOnUnderflow: false, raiseOnDivideByZero: false)); 

     return disp; 
    } 

    // Convert the least significant byte into a signed 8-bit integer 
    // Currently just truncates the fractional portion - I would like 
    // to test it instead and only round if there are decimals. 
    var safeByteValue: Int8 { 
     get { 
      let bits = UInt8(decimalNumberRoundedToDigits(0).longLongValue & 0xFF); 

      return Int8(bitPattern: bits); 
     } 
    }; 
} 

// just a test loop for demonstration 
for i in 0...256 
{ 
    print(NSDecimalNumber(unsignedInt: UInt32(bitPattern: Int32(i))).safeByteValue); 
} 
+1

你能解釋一下「使用案件」?爲什麼它是否有小數位? – matt

+0

我正在編寫一個計算應用程序,它嚴重依賴位模式,比如處理無符號的32位整數或有符號的64位長等。我發現在NSDecimalNumber中,有時EG的屬性longValue無法正確工作有小數。這個問題總是在你回合時消失 - 所以我只是想避免在用戶每次想看到一個數字的8位版本時創建一個新的數字,並且只有在用戶想要的時候才輪到這個數字(因此這個問題,我不知道這個數字是否被舍入)。 – absmiths

+0

如果沒有四捨五入,你無法做到這一點。要檢查小數位數,您需要檢查尾數和指數的值。假設尾數等於'1000000',指數要麼是'-20'或'0'。你總是需要輪迴,然後與原始數字進行比較。沒有其他安全的方法。 – Sulthan

回答

0

我不知道如何有效的,這將是,但它確實給你答案:

extension NSDecimalNumber { 
    var hasFractionalComponent: Bool { 
     return ("\(num)").unicodeScalars.contains(UnicodeScalar(".")) 
    } 
} 
相關問題