Swift如何统计小数点后全为零的小数位数?
问题:统计小数点右侧全为零的数字位数
需求:给定带小数的数字,若小数点右侧全为零,统计这些零的位数。例如输入1.00000000,期望输出8。
现有代码可统计普通小数的位数,但无法处理小数点后全为零的情况:
let decimalDigits = String(totalValue).split(separator: "\.").last?.count ?? 0 extension Double { func decimalCount() -> Int { if self == Double(Int(self)) { return 0 } let integerString = String(Int(self)) let doubleString = String(Double(self)) let decimalCount = doubleString.count - integerString.count - 1 return decimalCount } }
伪代码逻辑:
if to right of decimal all zeros
count number of zeros
问题分析
现有代码失效的核心原因:
Double类型无法区分1.0和1.00000000,二者数值相等;直接将Double转为String时,会自动省略末尾的零,导致无法获取原始小数位数。- 扩展中的判断
self == Double(Int(self))会把所有整数数值(包括带末尾零的小数)直接返回0,忽略了原本的小数位信息。
解决方案
方案1:直接处理字符串输入(推荐,保留原始格式信息)
如果输入是字符串形式(比如用户输入的文本),直接解析字符串可准确获取小数位的零个数:
func countTrailingZeroDecimals(from input: String) -> Int { let parts = input.split(separator: ".") // 无小数点或小数部分为空,返回0 guard parts.count == 2, let decimalPart = parts.last else { return 0 } // 检查小数部分是否全为零 guard decimalPart.allSatisfy({ $0 == "0" }) else { return 0 } return decimalPart.count } // 测试用例 print(countTrailingZeroDecimals(from: "1.00000000")) // 输出8 print(countTrailingZeroDecimals(from: "3.1400")) // 输出0(小数部分不全为零) print(countTrailingZeroDecimals(from: "5")) // 输出0
方案2:针对Double类型,通过格式化保留小数位
如果必须从Double处理,需先通过NumberFormatter强制保留指定小数位数,再解析字符串:
extension Double { func countTrailingZeroDecimalPlaces(with formatter: NumberFormatter) -> Int { guard let formattedString = formatter.string(from: NSNumber(value: self)) else { return 0 } let parts = formattedString.split(separator: ".") guard parts.count == 2, let decimalPart = parts.last else { return 0 } guard decimalPart.allSatisfy({ $0 == "0" }) else { return 0 } return decimalPart.count } } // 使用示例 let numberFormatter = NumberFormatter() numberFormatter.minimumFractionDigits = 8 // 强制保留8位小数 numberFormatter.maximumFractionDigits = 8 numberFormatter.numberStyle = .decimal let value: Double = 1.0 print(value.countTrailingZeroDecimalPlaces(with: numberFormatter)) // 输出8
内容的提问来源于stack exchange,提问作者adalovelacy
相关产品推荐
相关产品推荐

