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);
}
你能解釋一下「使用案件」?爲什麼它是否有小數位? – matt
我正在編寫一個計算應用程序,它嚴重依賴位模式,比如處理無符號的32位整數或有符號的64位長等。我發現在NSDecimalNumber中,有時EG的屬性longValue無法正確工作有小數。這個問題總是在你回合時消失 - 所以我只是想避免在用戶每次想看到一個數字的8位版本時創建一個新的數字,並且只有在用戶想要的時候才輪到這個數字(因此這個問題,我不知道這個數字是否被舍入)。 – absmiths
如果沒有四捨五入,你無法做到這一點。要檢查小數位數,您需要檢查尾數和指數的值。假設尾數等於'1000000',指數要麼是'-20'或'0'。你總是需要輪迴,然後與原始數字進行比較。沒有其他安全的方法。 – Sulthan