NSDecimalNumber 如何判断是不是有小数部分

Posted

技术标签:

【中文标题】NSDecimalNumber 如何判断是不是有小数部分【英文标题】:NSDecimalNumber how to determine if there is a fractional componentNSDecimalNumber 如何判断是否有小数部分 【发布时间】:2016-04-20 01:59:06 【问题描述】:

我有一个用例,我想确定 Swift 中的 NSDecimalNumber 是否有小数部分(0 除外)。我可以截断小数部分,但这涉及到创建一个新的 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);

【问题讨论】:

你能解释一下“用例”吗?为什么有没有小数位很重要? 我正在编写一个严重依赖位模式的计算应用程序,例如处理无符号 32 位整数或有符号 64 位长整数等。我发现在 NSDecimalNumber 中,有时 EG 的属性, longValue 在有小数时不能正常工作。当你四舍五入时问题总是消失 - 所以我只是想避免每次用户想要查看数字的签名 8 位版本时创建一个新数字,并且只有在用户想要的时候才四舍五入(因此这个问题,我不知道这个数字是否已经四舍五入了)。 如果不进行四舍五入,您将无法做到这一点。要检查小数位数,您需要检查尾数和指数的值。想象尾数等于1000000 和指数-200。您总是必须四舍五入,然后与原始数字进行比较。没有其他安全的方法。 这很不幸,但我可以忍受。我需要正确性而不是性能。我只是希望我还没有找到我需要的东西。 顺便说一下,所有longLongValue 方法首先将NSDecimalNumber 转换为double,修剪所有额外的精度。请注意,NSDecimalNumber 使用十进制算术,而不是二进制。这意味着所有计算都比double 慢。我不确定在依赖于位模式(即二进制算术)的应用程序中这是一个好主意。 【参考方案1】:

我不知道这会有多高效,但它确实给了你答案:

extension NSDecimalNumber 
    var hasFractionalComponent: Bool 
        return ("\(num)").unicodeScalars.contains(UnicodeScalar("."))
    

【讨论】:

以上是关于NSDecimalNumber 如何判断是不是有小数部分的主要内容,如果未能解决你的问题,请参考以下文章

如何在 NSDecimalNumber 中存储 1.66

如何在不损失精度的情况下解码 NSDecimalNumber?

NSDecimalNumber 值的比例和精度

舍入 NSDecimalNumber HalfDown

IOS中如何使用NSDecimalNumber转换经纬度

使用 numberFromString 生成 NSDecimalNumber 时如何在没有分数错误的情况下获得舍入值?