doubel 转String 容易出现精度问题。
解决这个问题可以用
func mc_toString(maxDigits: Int) -> String? {
let formatter = NumberFormatter()
formatter.minimumFractionDigits = 0
formatter.maximumFractionDigits = maxDigits
formatter.roundingMode = .halfUp
let retult = formatter.string(for: self)
return retult
}
需要留意 formatter.roundingMode = .halfUp 这个枚举的设置。这个枚举默认的是HALF_EVEN
HALF_EVEN : 银行家舍入法。 可以看下面的解释。
halfUp: 是经典的四舍五入方式。
// 默认模式,也是最绕人的模式
/*
向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
如果舍弃部分左边的数字为奇数,则舍入行为同 RoundingMode.HALF_UP;如果为偶数,则舍入行为同 RoundingMode.HALF_DOWN。
注意,在重复进行一系列计算时,此舍入模式可以在统计上将累加错误减到最小。
此舍入模式也称为“银行家舍入法”,主要在美国使用。
此舍入模式类似于 Java 中对 float 和 double 算法使用的舍入策略。
*/
case halfEven = 4
// 向上取整
// 如 8.5 -> 9 ; 2.3 -> 2; -2.3 -> -2
case ceiling = 0
// 向下取整 8.5 -> 8 ; -8.5 -> 9
case floor = 1
//去掉小数部分取整,也就是正数取左边,负数取右边,相当于向原点靠近的方向取整
case down = 2
// 始终对非零舍弃部分前面的数字加 1 , 负数是减一 相当于向原点远离的方向取整
// 如 8.5 -> 9 ; 2.3 -> 3
case up = 3
// 四舍五入
case halfUp = 6
// 四舍五入
case halfDown = 5