You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 08:04:58