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
相关产品推荐
相关产品推荐

