今天遇到了一件怪事。函数返回值始终是0,但是中间计算过程又没啥问题。
最终判定,就是在计算百分比时将Decimal计算的百分比,通过(decimal as NSDecimalNumber).intValue进行输出时出错的。
深入分析具体的原因,是因为Int的精度不足以转换NSDecimalNumber,所以就自动设置为0了。这个对于普通人来说,可能很难理解。毕竟结果也才46,怎么说Int的精度不足呢?但是事实就是如此,你可以简单地认为就是46后面的小数点之后的位数过多了。
解决的办法有有两个,一种是直接使用.doubleValue,然后取整。
let intValue = Int(nsDecimalNumber.doubleValue)
另一种则比较复杂,使用了专门的rounding函数。
let rounded = nsDecimalNumber.rounding(accordingToBehavior: NSDecimalNumberHandler(
roundingMode: .plain,
scale: 0,
raiseOnExactness: false,
raiseOnOverflow: false,
raiseOnUnderflow: false,
raiseOnDivideByZero: true
))
let intValue = rounded.intValue