你在开发中遇到过计算结果小数点后莫名多出一堆数字吗?
刚接触iOS开发的新手们,一定遇到过这样的场景:计算价格要保留两位小数时,9.865元显示成9.86还是9.87?用计算器都能解决的问题,为什么在代码里就失控了?别急,今天带你彻底搞懂iOS的四舍五入玄学!
一、为什么需要特殊处理?
先看这段代码:
let num = 0.1 + 0.2
print(num) // 输出0.30000000000000004
计算机用二进制存储小数时会产生精度丢失,就像用10进制无法精确表示1/3一样。这种情况在金融计算、数据统计时会造成致命错误。
二、基础四舍五入方法
方案1:round函数
• 直接取整:round(3.1415) // 3.0
• 保留两位小数:round(3.1415 * 100) / 100 // 3.14
方案2:指定精度
let price = 9.865
String(format: "%.2f", price) // 自动四舍五入为"9.87"
三、高手都在用的进阶技巧
1. NSDecimalNumber(金融级计算)
let decimal = NSDecimalNumber(value: 9.865)
let handler = NSDecimalNumberHandler(roundingMode: .plain, scale: 2, raiseOnExactness: false, raiseOnOverflow: false, raiseOnUnderflow: false, raiseOnDivideByZero: false)
decimal.rounding(accordingToBehavior: handler) // 精确得到9.87
2. NumberFormatter(国际化适配)
let formatter = NumberFormatter()
formatter.maximumFractionDigits = 2
formatter.minimumFractionDigits = 2
formatter.string(from: 9.865 as NSNumber) // "9.87"
四、新手必踩的3个大坑
1. 负数陷阱:round(-3.5)得到-4.0而不是-3
2. 中间值规则:round(2.5)默认变成2.0(向偶数取整)
3. 类型转换误差:Double转Float时可能丢失精度
五、什么时候该用哪种方案?
• 简单计算 → 基础round方案
• 金融系统 → 必须用NSDecimalNumber
• 显示格式化 → NumberFormatter最佳
• 游戏数值 → 直接类型转换更高效
小编观点:永远不要相信浮点数的自动四舍五入!根据业务场景选择方案,涉及钱的必须上NSDecimalNumber,其他情况优先使用NumberFormatter保证显示正确性。