使用NumberFormatter将字符串转数字未得到预期结果求助
解决NumberFormatter转"79.99"出现精度偏差的问题
这个问题本质是浮点数二进制精度限制导致的:Double类型无法精确表示所有十进制小数,"79.99"转成Double时就会出现微小的精度损失,这时候调整舍入模式没用——因为精度损失发生在转成Double的环节,而非格式化阶段。
直接给出可行方案:让NumberFormatter返回Decimal类型(而非默认的Double),具体步骤如下:
- 设置
generatesDecimalNumbers = true,让 formatter 生成NSDecimalNumber(Swift里可桥接为Decimal类型),它能精确表示十进制小数 - 配合设置合适的
numberStyle(比如.decimal)确保解析逻辑正确
修改后的代码示例:
let formatter = NumberFormatter() formatter.numberStyle = .decimal formatter.generatesDecimalNumbers = true if let sample1 = formatter.number(from: "29.99") as? Decimal { print(sample1) // 输出 29.99 } if let sample2 = formatter.number(from: "79.99") as? Decimal { print(sample2) // 输出 79.99 }
如果后续需要将Decimal转为Double展示,建议先格式化到指定小数位再转换,比如:
let decimalValue: Decimal = 79.99 let doubleValue = Double(truncating: decimalValue as NSNumber) print(String(format: "%.2f", doubleValue)) // 输出 79.99
核心逻辑就是用Decimal类型规避二进制浮点数的精度缺陷,从根源解决问题。
内容的提问来源于stack exchange,提问作者Coder
相关产品推荐
相关产品推荐

