Почему Lua работает именно так и как решить проблему с плавающими числами? - PullRequest
0 голосов
/ 26 сентября 2019

Это мой код:

a=20.4*100
print(a,math.floor(a),math.floor(2040))

Результат в консоли:

2040    2039    2040

Если == 2040, то почему, когда я делаю math.floor с этим числом, оно уменьшается?Как я могу написать математические функции с большей точностью, чем это странное поведение?

1 Ответ

1 голос
/ 26 сентября 2019

Проще говоря: у компьютеров нет бесконечной памяти, поэтому они могут использовать столько разрядов для хранения числа.Если число имеет слишком много знаков после запятой, они где-то обрезаются, и так уж получается, что в двоичном представлении 0,4 (два пятых) больше знаков, чем может сохранить;так что после их обрезания у вас останется 0,399999 что-то, что print достаточно умно, чтобы напечатать до 0,4, но если вы floor(), оно округляется без жалости, что приводит к полученным результатам.

Также, пожалуйста, обратите внимание, что вы могли бы просто гуглить это;это один из самых распространенных вопросов в программировании;)


Например, попробуйте это:

string.format("%f",     20.4*100)
--> 2040.000000
string.format("%0.20f", 20.4*100)
--> 2039.99999999999977262632
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...