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

如何从被标记为.isInfinite的非零除数值中获取4.53(Double类型)?

解决Double值4.5300000000000002转成4.53(Double类型)的问题

嘿,这种浮点数精度的坑真的太闹心了!我之前也踩过类似的雷,给你几个实用的方法把这个近似值转成你要的4.53 Double类型:

方法1:快速四舍五入计算(适合固定两位小数场景)

如果确定只需要保留两位小数,直接用乘法+取整+除法的组合,简单高效:

let originalValue = 4.5300000000000002
let correctedValue = (originalValue * 100).rounded() / 100
print(correctedValue) // 输出 4.53
print(type(of: correctedValue)) // Double类型

原理很简单:把数值放大100倍后取整,再缩小回原比例,自动完成四舍五入。

方法2:扩展Double实现指定小数位的四舍五入

如果需要处理不同小数位的场景,给Double写个扩展方法,复用性更强:

extension Double {
    func rounded(toPlaces places: Int) -> Double {
        let multiplier = pow(10, Double(places))
        return (self * multiplier).rounded() / multiplier
    }
}

let originalValue = 4.5300000000000002
let correctedValue = originalValue.rounded(toPlaces: 2)
print(correctedValue) // 4.53

方法3:用NumberFormatter做灵活格式化转换

如果需要自定义舍入规则(比如向下取整、向上取整),可以用NumberFormatter来处理:

let originalValue = 4.5300000000000002
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.maximumFractionDigits = 2
formatter.roundingMode = .halfUp // 四舍五入,也可选.roundDown/.roundUp等模式

if let formattedString = formatter.string(from: NSNumber(value: originalValue)),
   let correctedValue = Double(formattedString) {
    print(correctedValue) // 4.53
}

另外提个小疑问:你说这个值被标记为.isInfinite有点反常,因为4.5300000000000002本身是有限的Double值,实际调用.isInfinite应该返回false。建议检查下代码里标记无限的逻辑,是不是前面的计算步骤不小心产生了真正的无限值(比如除以极小的数导致溢出?),避免后续再踩同样的坑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:34:41