# Делюсь
Wol4ik(syscall,22) — All
2017-10-08 19:57:42


...в продолжение выше опубликованных сообщений. Если идет работа с выводом дробной переменной, то я понял, что лучше ставить округление заведомо больше.
p ('тепло ', round(hot,2)); -- округление вывода hot c аргументом 2 по совету Петра.
В примере Петра, работало округление round (переменная, 2) при шаге вычитания не более 0.2. Но при шаге вычитания 0.4 округление ...,2 выдает при чистом нуле "-0" (минус ноль). Снимается это установкой избыточного округления ...,3 вместо 2.
p ('тепло ', round(hot,3)); -- округление вывода hot c аргументом 3. Если результат вычитания 
                            -- равен нулю, то выводится чистый обычный ноль без всяких знаков.

# Re: Делюсь
Peter(syscall,1) — Wol4ik
2017-10-09 05:32:47


Гм. А если взять 1й пример для round по той ссылке? Можешь попробовать?

# Re: Делюсь
Peter(syscall,1) — Wol4ik
2017-10-09 05:44:19


Ну то-есть вот эту попробуй? Я ее в git версию добавил как math.round:
function round(num, numDecimalPlaces)
  local mult = 10^(numDecimalPlaces or 0)
  return math.floor(num * mult + 0.5) / mult
end

# Re: Делюсь
Wol4ik(syscall,22) — Peter
2017-10-09 06:48:58


Проверил на другом компьютере, там минус ноль не выводилось при старых параметрах. Странно. Обновленный Инстед и код ношу на флешке с собой. Проверю вечером на прежнем ПК, с новой функцией и без нее. Но совершенно точно вчера выдодился минус ноль при нуле и я это устранил изменением аргумента округления с 2 на 3. Тщательно перепроверю все, чтобы исключить неверное понимание.

# Re: Делюсь
Peter(syscall,1) — Wol4ik
2017-10-09 07:16:07


Это особенности float. Давай попробуем с другой функцией, а я еще полумаю.

Так то можно делать вывод с помощью string.format(), но это как то сложновато. Может быть я встрою ее в p функцию. Надо подумать.

# Re: Делюсь
Wol4ik(syscall,22) — Peter
2017-10-09 10:02:33


Пётр, а вдруг не у всех будет Инстед3 обновленный из гита. Я вот пока думаю переделать механику игры и не выводить само число тепла. А сделать так, вычисления с дробями проводить, как и раньше, но выводить результат словами - «холодно», «очень холодно», «прохладно», «жарко» и т.п.

Вопрос вот в чем, если я не вывожу на экран и никак не округляю результаты вычислений с дробями, они эти вычисления остаются точными? Ну то есть если результат вычитания равен нулю, то я могу этот ноль поймать в условии заданном if ... then... ?

П.с. все ранее оговоренные проверки функций я сделаю.

# Re: Делюсь
Peter(syscall,1) — Wol4ik
2017-10-09 10:34:30


> Пётр, а вдруг не у всех будет Инстед3 обновленный из гита.
Не обязательно инстед из гита, просто раз ты столкнулся с проблемой я хочу ее решить в будущих версиях.

Я думаю, что вычисления точные.

round другой интересно попробовать и сравнить результаты.

По идее можно округлять рез-т только при вывроде: p(string.format("%02f", myvar)), но мне хотелось бы попробовать с round...

# Re: Делюсь
Wol4ik(syscall,22) — Peter
2017-10-09 11:13:25


Да, конечно. Займусь сегодня. Раз мы это обсуждаем, спрошу еще одно на будущее. Как сделать вывод фиксированного количества знаков после запятой в дроби, даже если там нули? Да так, чтобы round работал при выводе? (Понял, что round проще делать только для вывода p, pn)
0.2 => 0.200

# Re: Делюсь
Peter(syscall,1) — Wol4ik
2017-10-09 13:23:34


> Как сделать вывод фиксированного количества знаков после запятой в дроби, даже если там нули?
По идее, так: p(string.format("%.2f", 0.01234))
Вот это и надо как то упростить в след версиях, это lua конструкция форматированного вывода.