Цикл:
for i = 0.1, 0.3, 0.1 do
message(tostring(i))
end
Результат:
0.1
0.2
Цикл:
for i = 0.1, 0.5, 0.1 do
message(tostring(i))
end
Результат:
0.1
0.2
0.3
0.4
0.5
Забавно да?
А я этому LUA доверяю свои деньги! Кто знает, где у него еще косяки зарыты...
----------------------------------------
QUIK 8.13.1.16 / LUA 5.3.5 и 5.4.1
операции с десятичными числами активно используются не только в циклах… например, код LUA:
local a, b = 0.1, 0.2
if a + b ~= 0.3 then
message(«Fuck»)
end
возвращает:
Fuck
… напороться на эту херню можно в любой момент… а это, блть, ни в какие ворота))
К сожалению, в этом формате многие числа не могут быть представлены точно. В частности, ниже в этом треде Вам уже указали, что в IEEE-754 число 0.3 «округляется» до
0.30000000000000004.<br />Как быть? Если точность важна, то не следует использовать числа с плавающей точкой =)
. Ваши примеры следует переписать в виде:и
Надеюсь, понятно объяснил.
Сам язык вообще немного. В основном C-API, что многим вообще не надо.
0.1 + 0.2 = 0.30000000000000004 (можете проверить в любом языке программирования, который использует IEEE 754).
и чего чего еще «лучше избегать»?))
Вы ведь не спросили в чем прикол такого исполнения, а поспешили определить молоток LUA.
Я же говорю язык для бездельников. В классическом языке вы еще для каждой переменной обозначите ее тип.
The number type represents real (double-precision floating-point) numbers. Lua has no integer type, as it does not need it.
www.lua.org/pil/2.3.html
Сходное поведение подобной «программы» будет в большинстве языков программирования.
А тому, кто циклу с дробными числами доверяет деньги можно грамоту выдать за отвагу.
вам это не кажется странным?.. нет?.. почему?
Цикл с числом типа double доступен в любом языке программирования.
Не вижу причин, почему в LUA должно быть иначе
Для чего он нужен? Ну, вероятно, именно для этого — непредсказуемость количества шагов цикла.
если нет возможности декларировать тип числовой переменной, то получается такое:
0.1 + 0.2 не равно 0.3
0.15 + 0.15 равно 0.3
… и такое может случиться в любом месте алгоритма
И в любом языке никто не гарантирует, что
0.1+0.1+0.1 = 0.3
Это особенность представления чисел с плавающей точкой.
И она справедлива для всех языков. И связана она с двоичным представлением числа в памяти компьютера, а не чьим-то злым умыслом.
Просто следует учитывать это в своих программах. Еще раз подчеркну, в программах на любом языке.
вы какой тип хотите декларировать?
Прекрасный тип который умеет представлять числа с дробной частью без ошибок округления?
Не завезли такие в большинство языков. Вы тот же результат что и в Lua получите в C, C++, C#, Java, JS и так далее.
Не нравится пишишь(или используешь готовую) реализацию типа decimal и пользуешься
и у тебя будет толеранс