当前位置:  开发笔记 > IOS > 正文

计算Swift中Float(或Decimal)中的小数位数

如何解决《计算Swift中Float(或Decimal)中的小数位数》经验,为你挑选了1个好方法。

我想计算浮点数(或NSDecimalNumber)中的小数位数(忽略尾随零),例如:

1.45000 => 2
5.98 => 2
1.00 => 0
0.857 => 3
5 => 0

我怎么能做到这一点?



1> Rob Napier..:

如果正确创建了Decimal,使用Decimal执行此操作非常简单.小数存储为significand * 10^exponent.significand被归一化为可能的最小整数.因此对于1230,有效数为123,指数为1.对于1.23,有效数也为123,指数为-2.这导致我们:

extension Decimal {
    var significantFractionalDecimalDigits: Int {
        return max(-exponent, 0)
    }
}

但是,您必须非常小心地构造Decimal.如果从Double构造它,则您已经应用了二进制舍入错误.例如:

let n = Decimal(0.111) // 0.11100000000000002048 because you passed a Double
significantFractionalDecimalDigits // 20

let n = Decimal(string: "0.111")!
n.significantFractionalDecimalDigits // 3 what you meant

请记住,当然Decimal具有最大有效位数,因此它仍然可以应用舍入.

let n = Decimal(string: "12345678901235678901234567890.1234567890123456789")!
n.significantFractionalDecimalDigits // 9 ("should" be 19)

如果你在这条路上行走,你真的必须阅读浮点指南和规范的StackOverflow问题:浮点数学是否被打破?

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有