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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 08:07:39