我想计算浮点数(或NSDecimalNumber)中的小数位数(忽略尾随零),例如:
1.45000 => 2 5.98 => 2 1.00 => 0 0.857 => 3 5 => 0
我怎么能做到这一点?
如果正确创建了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问题:浮点数学是否被打破?