如何从被标记为.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
相关产品推荐
相关产品推荐

