swift Double 四舍六入五单双

四舍六入五单双的官方结束如下:“四舍六入五单双”的法则:即看要保留的有效数字后一位数字,如果大于5,向前进一位,小于4则舍去.等于5则看5后,如5后不全为0,则进一位.5后全为零则看5前,若为奇,则进1,若为偶,则舍去.
但是swift中似乎并不是这样,我举个例子说明:

class func doubleToString(value:Double,point:Int)->String{
      return   NSString(format: "%.\(point)f", value) as String
    }

print(Common.doubleToString(12.6225, point: 3)) //12.623
print(Common.doubleToString(12.6215, point: 3)) //12.621
注释后面跟着的就是打印值,和定义的规则似乎有出入。

那么,还有一点很奇怪的现象就是:
var sum:Double = 0
下面的值分别是:13.51,11.51,12.51,13.51,因为需要统一保留三位小数,所以我丧心病狂的使用了上面的方法把这些数据转成了“13.510”,“11.510”,“12.510”,“13.510”
然后再使用sum = sum + Double(v)! 求和
再然后 let s = Common.doubleToString(sum/4.0, point: 3)
无数次循环下,答案居然出现了12.623 /12.622交替随机出现的情况。
打印su m/4.0得到的答案是12.6225,直接打印Common.doubleToString(12.6225, point: 3)打印出的结果始终都是12.623,直接打印Common.doubleToString(50.49/4.0, point: 3)打印出的结果也是依然坚持12.623,并无任何随机情况出现。于是,所以我开始推测,sum和50.49既然有不同的结果,就说明两个值并不是完全相等,那么最可能的差距在哪里,就是小数位保留。
于是采用如下方式:

let st = Common.doubleToString(sum, point: 3)
let s = Common.doubleToString(Double(st)!/Double(c), point: 3)

果然答案始终是12.623,再无任何随机现象出现。
我没办法解释这个事情,先记下来,以后有了新的领悟再来修改吧。

猜你喜欢

转载自blog.csdn.net/yjw1007020425/article/details/62229909