Модуль decimal
Модуль decimal содержит функции для работы с числами высокой точности.
Это важно, когда числа велики или недопустима даже малейшая погрешность.
Например, Lua вычисляет 0.16666666666667 * 6 с использованием чисел с
плавающей запятой, поэтому результат равен 1. Но при использовании
модуля decimal (с помощью decimal.new для преобразования числа в тип
decimal) decimal.new('0.16666666666667') * 6 равно 1.00000000000002.
Чтобы создать число типа decimal, подключите модуль с помощью
require('decimal') и затем используйте decimal.new(n) или любую
функцию из модуля decimal:
- abs(n)
- exp(n)
- is_decimal(n)
- ln(n)
- log10(n)
- new(n)
- precision(n)
- rescale(decimal-number, new-scale)
- scale(n)
- sqrt(n)
- trim(decimal-number)
где n может быть строкой, числом другого типа или числом типа decimal. Если это строка или число другого типа, Tarantool преобразует его в число типа decimal перед выполнением операций. Рекомендуется создавать числа из строк и преобразовывать результат обратно в строки после вычислений, поскольку числа Lua имеют точность всего до 15 цифр.
Числа типа decimal имеют точность в N цифр, то есть общее количество цифр до и после десятичной точки может быть равно N. В Tarantool 3.5 точность была увеличена с N = 38 до N = 76.
decimal = require('decimal')e = decimal.exp(1)-- In Tarantool version 3.5 and above:decimal.precision(e)---- 76...#tostring(e)---- 77...-- In Tarantool versions before 3.5:decimal.precision(e)---- 38...#tostring(e)---- 39...
Tarantool поддерживает обычные арифметические операторы и операторы сравнения + - * / % ^ < > <= >= ~= ==. Если в операции участвуют как decimal, так и не-decimal операнды, то не-decimal операнд преобразуется в decimal перед выполнением операции.
Используйте tostring(decimal-number) для преобразования обратно в
строку.
Операция с числами типа decimal завершится ошибкой при переполнении (когда число больше 10^N - 1 или меньше -10^N - 1). Операция также завершится ошибкой, если арифметическое действие невозможно (например, деление на ноль или извлечение квадратного корня из -1). Если для получения точности в N цифр требуется округление цифр после десятичной точки, операция выполнится успешно.
Возвращает абсолютное значение числа типа decimal. Например, если a
равно -1, то decimal.abs(a) возвращает 1.
Возвращает e, возведённое в степень, заданную числом типа decimal.
Например, если a равно 1, то decimal.exp(a) возвращает
2.7182818284590452353602874713526624978 при N = 38 или
2.718281828459045235360287471352662497757247093699959574966967627724076630354
при N = 76. Для сравнения, math.exp(1) из математической библиотеки
Lua возвращает 2.718281828459.
Возвращает true, если переданное значение является числом типа
decimal, и false в противном случае. Например, если a равно 123,
то decimal.is_decimal(a) возвращает false. Если a равно
decimal.new(123), то decimal.is_decimal(a) возвращает true.
Возвращает натуральный логарифм числа типа decimal. Например, если a
равно 1, то decimal.ln(a) возвращает 0.
Возвращает логарифм по основанию 10 числа типа decimal. Например, если
a равно 100, то decimal.log10(a) возвращает 2.
Возвращает входное значение как число типа decimal. Например, если a
равно 1E-1, то decimal.new(a) возвращает 0.1.
Возвращает количество цифр в числе типа decimal. Например, если a
равно 123.4560, то decimal.precision(a) возвращает 7.
Возвращает число после возможного округления или дополнения нулями. Если
количество цифр после десятичной точки больше new-scale, выполняется
округление. Правило округления: от нуля до половины. Если количество
цифр после десятичной точки меньше new-scale, выполняется дополнение
нулями. Например, если a равно -123.4550, то decimal.rescale(a, 2)
возвращает -123.46, а decimal.rescale(a, 5) возвращает -123.45500.
Возвращает количество цифр после десятичной точки в числе типа decimal.
Например, если a равно 123.4560, то decimal.scale(a) возвращает
4.
Возвращает квадратный корень числа типа decimal. Например, если a
равно 2, то decimal.sqrt(a) возвращает
1.4142135623730950488016887242096980786 при N = 38 или
1.414213562373095048801688724209698078569671875376948073176679737990732478462
при N = 76.
Возвращает число типа decimal после возможного удаления trailing-нулей
после десятичной точки. Например, если a равно 2.20200, то
decimal.trim(a) возвращает 2.202.