Tarantool CE/EE Documentation portal logo
Помощь
Обновлена 15 сентября 2026 г. в 08:55

Модуль 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:

где 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.abs(string-or-number-or-decimal-number)

Возвращает абсолютное значение числа типа decimal. Например, если a равно -1, то decimal.abs(a) возвращает 1.

decimal.exp(string-or-number-or-decimal-number)

Возвращает e, возведённое в степень, заданную числом типа decimal. Например, если a равно 1, то decimal.exp(a) возвращает 2.7182818284590452353602874713526624978 при N = 38 или 2.718281828459045235360287471352662497757247093699959574966967627724076630354 при N = 76. Для сравнения, math.exp(1) из математической библиотеки Lua возвращает 2.718281828459.

decimal.is_decimal(string-or-number-or-decimal-number)

Возвращает true, если переданное значение является числом типа decimal, и false в противном случае. Например, если a равно 123, то decimal.is_decimal(a) возвращает false. Если a равно decimal.new(123), то decimal.is_decimal(a) возвращает true.

decimal.ln(string-or-number-or-decimal-number)

Возвращает натуральный логарифм числа типа decimal. Например, если a равно 1, то decimal.ln(a) возвращает 0.

decimal.log10(string-or-number-or-decimal-number)

Возвращает логарифм по основанию 10 числа типа decimal. Например, если a равно 100, то decimal.log10(a) возвращает 2.

decimal.new(string-or-number-or-decimal-number)

Возвращает входное значение как число типа decimal. Например, если a равно 1E-1, то decimal.new(a) возвращает 0.1.

decimal.precision(string-or-number-or-decimal-number)

Возвращает количество цифр в числе типа decimal. Например, если a равно 123.4560, то decimal.precision(a) возвращает 7.

decimal.rescale(decimal-number, new-scale)

Возвращает число после возможного округления или дополнения нулями. Если количество цифр после десятичной точки больше new-scale, выполняется округление. Правило округления: от нуля до половины. Если количество цифр после десятичной точки меньше new-scale, выполняется дополнение нулями. Например, если a равно -123.4550, то decimal.rescale(a, 2) возвращает -123.46, а decimal.rescale(a, 5) возвращает -123.45500.

decimal.scale(string-or-number-or-decimal-number)

Возвращает количество цифр после десятичной точки в числе типа decimal. Например, если a равно 123.4560, то decimal.scale(a) возвращает 4.

decimal.sqrt(string-or-number-or-decimal-number)

Возвращает квадратный корень числа типа decimal. Например, если a равно 2, то decimal.sqrt(a) возвращает 1.4142135623730950488016887242096980786 при N = 38 или 1.414213562373095048801688724209698078569671875376948073176679737990732478462 при N = 76.

decimal.trim(decimal-number)

Возвращает число типа decimal после возможного удаления trailing-нулей после десятичной точки. Например, если a равно 2.20200, то decimal.trim(a) возвращает 2.202.