Вам не нужна необработанная производительность от операции, которую Вы будете выполнять чрезвычайно нечасто с точки зрения ЦП.
> print(string.format("%18.0f",1247687475123456))
1247687475123456
Lua, как обычно настроен, использует обычный для вашей платформы формат с плавающей запятой двойной точности для хранения всех чисел. Для большинства настольных платформ сегодня это будет 64-битный формат IEEE-754. Общепринятое мнение состоит в том, что целые числа в диапазоне от -1E15 до + 1E15 можно безопасно считать представленными точно.
В любом случае, функция string.format ()
проходит аргументы (с некоторыми незначительными изменениями) в платформенную реализацию printf ()
. Строка формата, распознаваемая функцией printf ()
, включает % e
и % E
, чтобы заставить «научную» нотацию, и % f
, чтобы заставить простая десятичная запись. Кроме того, % g
и % G
выбирают кратчайшее обозначение.
Например:
E:\...>lua Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio > a = 1e17/3 > print(string.format("%f",a)) 33333333333333332.000000 > print(string.format("%e",a)) 3.333333e+016 > print(string.format("%.0f",a)) 33333333333333332
Обратите внимание, что если значение помещается в диапазон 32-битных целых чисел со знаком, вы также можете использовать формат % d
. Однако результаты не будут четко определены, если значение превышает этот диапазон. Системные отметки времени в микросекундах, вероятно, превысят 32-битный диапазон.
Если 16 десятичных цифр недостаточно точны, есть несколько вариантов, доступных для повышения точности.
Во-первых, было бы несложно упаковать истинное 64-битное целое число в пользовательские данные
вместе с подходящим набором арифметических метаметодов. Это время от времени обсуждается в списке рассылки Lua , но я не припомню, чтобы кто-то выпустил завершенный модуль.
Во-вторых, один из авторов Lua выпустил два модуля, поддерживающих арифметику произвольной точности: lbc и lmapm .