一、截断除法介绍
对一个数求余数的,如果是整数运算,我们可以使用%来做;如果是浮点型数据的话,我们就需要用截断除法了. 浮点型不能用%来取余.png// 截断除法取余
func testRemainder() {
let a1 = 15 % 4
let a2 = 15.1.truncatingRemainder(dividingBy: 4.1)
print(a1, a2)
}
二、截断除法的原理
目前自己能想到的实现方法:
- 将小数转化为整数,然后对整数取余,之后再转化为小数,这个就就是余数。
- 用一个循环减被除数,直到小于0,就把上一个拿来减除数的值返回,这个就是余数。
- 先做除法向下取整求得商,之后再根据商来计算得到余数:除数 = 被除数 * 商 + 余数。
实际:按照注释的解释应该是使用的第3种。
三、截断除法的使用例子:
我们展示金额时,去掉无效数字0的方式:
// 分转元,并且去掉金额的无效数字0
func testPurifyYuan(with amountFen: Double) -> String {// 金额单位是分
// 分转元
let ret = amountFen / 100
if amountFen.truncatingRemainder(dividingBy: 100) == 0 { // 刚好是整数元
return String(format: "%.0f", ret)
} else if amountFen.truncatingRemainder(dividingBy: 10) == 0 { // 刚好是整数元
return String(format: "%.1f", ret)
} else {
return String(format: "%.2f", ret)
}
}
四、与remainder(dividingBy other: Double) -> Double
的区别
remainder(dividingBy other: Double) -> Double
方法也是可以取余的,与截断除法取余的区别在于,求商时,向偶数的一侧取整,这样遇到0.5以上时,余数是负数。
// 8.625 / 0.75 = 11.5
// 这里的11就是对11.5向下取整的结果
// 8.625 = 0.75 * 11 + 0.375
let r2 = 8.625.truncatingRemainder(dividingBy: 0.75)
print(r2) // 0.375
// 这里的12就是对11.5向偶数侧取整的结果
// 8.625 = 0.75 * 12 - 0.375
let r = 8.625.remainder(dividingBy: 0.75)
print(r) // -0.375
网友评论