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

SwiftUI中Double/Float转换百分比始终返回0.0问题求助

问题:整数转百分比返回0.0的原因及解决方法

你遇到的核心问题是整数除法的截断特性:在Swift中,两个整数类型(比如Int64)相除时,会直接舍弃小数部分,只保留整数结果。

看你的代码:

  • num的值是33(Int64类型)
  • num / 100是整数运算,33除以100的整数结果是0,再转成Double自然就是0.0

解决方法

有两种简单的修正方式:

方式1:先将整数转为浮点类型再做除法

把let percent = Double(num / 100)修改为:

let percent = Double(num) / 100

这样Double(num)会把33转为33.0(Double类型),除以100后得到正确的0.33。

方式2:直接用浮点运算计算百分比(更简洁)

跳过中间的num变量,直接用currentDay和goal计算比例,避免多余的整数运算:

if state.times.currentDay > 0 {
    let percent = Double(state.times.currentDay) / Double(state.times.goal)
    let clampedPercent = min(percent, 0.99) // 替代原来的三元表达式
    RingSpinner(newValue: clampedPercent)
        .onAppear {
            print("The value of currentDay: \(state.times.currentDay)")
            print("The percent is: \(clampedPercent)")
        }
}

这种方式更直接,也能利用你实际的业务变量(你代码里硬编码的609和1800应该对应state.times.currentDay和state.times.goal)。

补充说明

你用Int64处理大数避免溢出的思路是正确的,但只要涉及到需要保留小数的除法运算,必须先将至少一个操作数转为浮点类型(比如Double),否则整数除法会截断小数部分,导致结果不符合预期。

内容的提问来源于stack exchange,提问作者Neglected Sanity

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 09:43:01