extension String {
/// 解决精度丢失问题
func dealPrecisionLoss() -> String {
let doubleValue = Double(self) ?? 0
let doubleString = String(format: "%lf", doubleValue)
let decNumber = NSDecimalNumber(string: doubleString)
let outNumber = decNumber.stringValue
return outNumber
}
}
使用:将计算完的数据先转成字符串,解决精度问题,再转回字符串
var yingfukuan: CGFloat = rengoue.floatValue() / (1 + (annual_rate.floatValue() / 365.0 * due_day.floatValue()))
let yingfukuanStr = String(format: "%.2f", yingfukuan).dealPrecisionLoss()
yingfukuan = yingfukuanStr.floatValue()
let str = String(format: "%.2f", money).dealPrecisionLoss()
丢失精度可能会向下丢失精度,也可能会向上丢失精度,通常是在接收数据的时候,或者是在使用数据参与除法运算的时候;
使用NSDecimalNumber的multiplying 方法进行计算,依旧会丢失精度,最后使用上述方法彻底解决了精度丢失问题。