truncatingRemainder vs Swift中的余数

Den*_*er9 8 swift

Swift替换浮点数的%符号:


func truncatingRemainder(dividingBy other: Self) -> Self 
Run Code Online (Sandbox Code Playgroud)

使用截断除法返回此值的余数除以给定值.


func remainder(dividingBy other: Self) -> Self 
Run Code Online (Sandbox Code Playgroud)

返回此值的余数除以给定值.


文件似乎并不十分清楚.它们之间的实际区别是什么,何时应该优先使用哪一个?谢谢.

Mar*_*n R 11

truncatingRemainder计算"截断除法" remainder的余数,并计算"舍入除法"的余数.

示例(来自API参考):

let x = 8.625
let y = 0.75
Run Code Online (Sandbox Code Playgroud)

截断分区和余数:

let q1 = (x/y).rounded(.towardZero)
let r1 = x.truncatingRemainder(dividingBy: y)

print(q1, r1)      // 11.0 0.375
print(q1 * y + r1) // 8.625
Run Code Online (Sandbox Code Playgroud)

舍入除法和余数:

let q2 = (x/y).rounded(.toNearestOrEven)
let r2 = x.remainder(dividingBy: y)

print(q2, r2)      // 12.0 -0.375
print(q2 * y + r2) // 8.625
Run Code Online (Sandbox Code Playgroud)

因此,在任何情况下,剩余rem一师xy

rem = x - quot * y
Run Code Online (Sandbox Code Playgroud)

哪个quot是划分x的"圆形" y.

truncatingRemainder,quot是向零舍入的商,以及remainder,quot朝向最接近的整数取整的商.

结果truncatingRemainder具有总是相同的标志 作为股息,这不是必须的情况remainder.

如果这两个xy完全相同作为一个整数,然后的结果表示的

x.truncatingRemainder(dividingBy: y)
Run Code Online (Sandbox Code Playgroud)

是相同的

Int(x) % Int(y)
Run Code Online (Sandbox Code Playgroud)

使用整数余数运算符%.


Str*_*ers 6

这看起来像是……游乐场的工作!

let thing: Float = 8126.84652
let truncating = thing.truncatingRemainder(dividingBy: 10) // value is 6.84668, analog to %
let nonTruncating = thing.remainder(dividingBy: 10) // -3.15332
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,普通余数可以为负数(或者更确切地说,减去直到值 <=0),而截断余数将保持为正数。(当值 >=0 时停止)

  • truncatingRemainder 并不总是返回正值。返回值与“thing”符号相同 (3认同)