Перейти к содержимому

Целые и точность

Как получить целое число и остаток и чего ждать от дробей

среднийНужно знать: op: арифметика

Обычное деление отдаёт дробь, и это не всегда то, что нужно: предметы поштучно, тайлы целыми, номер связи целый. Для целых у op есть свои операции.

тик 0
Операция0
=
Операция1
=
Операция2
=
Операция3
=
Операция4
=
Операция5
=
@counter0number
точноnullnull
целоеnullnull
остатокnullnull
внизnullnull
знакnullnull
всегдаnullnull
Операция В блоке Что считает 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.

тик 0
Операция0
=
Операция1
=
Операция2
=
@counter0number
внизnullnull
вверхnullnull
ближеnullnull

floor округляет вниз, ceil вверх, round — к ближайшему целому. Половина у round уходит вверх: 2.5 становится 3, а не 2. У отрицательных «вниз» означает «дальше от нуля»: floor от −3.2 даёт −4.

Второго поля у всех трёх нет: округляют одно число.

тик 0
Операция0
=
Операция1
=
Операция2
=
@counter0number
суммаnullnull
равноnullnull
строгоnullnull

Сумма 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.