Swift Double.remainder (dividingBy :), возвращающий отрицательное значение - PullRequest
0 голосов
/ 24 сентября 2018
let num = 32.0
Double(num).remainder(dividingBy: 12.0)

Я получаю -4? .. вместо 8.0 ... он вычитает 12.0 из 8.0

как мне это исправить?

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

remainder(dividingBy:) не является функцией модуля.

В реальном делении 32.0/12.0 = 2.666666....Функция remainder (dividingBy:) определяет ближайшее к этому результату целое число как q: в данном случае 3.Таким образом, мы пишем:

32.O = q * 12 + r

, где q является целым числом, а r двойным.

32.0 = 3 * 12.0 + r ⇒ r = - 4.0

Остаток r, как определено этой функцией, равен-4.0.

0 голосов
/ 24 сентября 2018

Пожалуйста, внимательно прочитайте документацию :

Для двух конечных значений x и y остаток r от деления x на y удовлетворяет x == y * q + rгде q - целое число от до х / у.Если x / y находится точно посередине между двумя целыми числами, q выбирается четным.Обратите внимание, что q не вычисляется как x / y в арифметике с плавающей запятой, и что q не может быть представлено в любом доступном целочисленном типе.

(выделение мое)

Вы хотитеиспользуйте вместо этого truncatingRemainder (dividingBy:) :

let num = 32.0
let value = Double(num)
    .truncatingRemainder(dividingBy: 12)
print(value) // 8
...