Целые и точность
Как получить целое число и остаток и чего ждать от дробей
Обычное деление отдаёт дробь, и это не всегда то, что нужно: предметы поштучно, тайлы
целыми, номер связи целый. Для целых у op есть свои операции.
| Операция | В блоке | Что считает | 7 и 2 | −7 и 2 |
|---|---|---|---|---|
div |
/ |
обычное деление | 3.5 | −3.5 |
idiv |
// |
деление нацело | 3 | −4 |
mod |
% |
остаток | 1 | −1 (при −7 и 3) |
emod |
%% |
остаток без знака | 1 | 2 (при −7 и 3) |
Два числа в этой таблице стоит запомнить, потому что они удивляют.
idiv не отбрасывает дробную часть, а округляет вниз. У положительных это одно и то же,
у отрицательных — нет: −3.5 округляется вниз до −4, а не до −3. Если нужно именно отбросить,
берите модуль, делите, а знак возвращайте отдельно.
Знак остатка mod повторяет знак делимого. Остаток от −7 при делении на 3 — это −1,
а не 2. Для «всегда неотрицательного» остатка есть отдельная операция emod: она и отдаёт 2.
Округления
Заголовок раздела «Округления»floor округляет вниз, ceil вверх, round — к ближайшему целому. Половина у round
уходит вверх: 2.5 становится 3, а не 2. У отрицательных «вниз» означает «дальше от нуля»:
floor от −3.2 даёт −4.
Второго поля у всех трёх нет: округляют одно число.
Дроби считаются приблизительно
Заголовок раздела «Дроби считаются приблизительно»Сумма 0.1 и 0.2 равна 0.30000000000000004, и это не ошибка mlog. Числа хранятся так же, как почти везде — двоичной дробью, — а 0.1 в двоичной записи бесконечна, как ⅓ в десятичной. Хвост в семнадцатом знаке остаётся всегда.
Интересно другое: equal всё равно отвечает «равно». Сравнение чисел в mlog идёт
не точно, а с допуском 0.000001: всё, что ближе, считается одинаковым. Именно поэтому
арифметика с дробями обычно ведёт себя так, как ожидаешь.
А strictEqual (на кнопке — ===) допуска не знает и отвечает «не равно»: он сравнивает
значения ровно.
Неофициальный проект, с Anuke не связан. Спрайты, шрифты и переводы Mindustry © Anuke, используются по GPL-3.0; Fira Code — по OFL-1.1. Код сайта — GPL-3.0.