Модуль DecimalCalculations

Вернуться к оглавлению

Этот модуль содержит набор функций для десятичных вычислений с произвольной наперед заданной (константой в модуле, по умолчанию 37 десятичных значков) точностью. Необходимость в модуле возникла для целей точных десятичных вычислений с правилами округления при вычислениях, принятыми в математике и физике (а не в вычислительной технике или бухгалтерии). Скорость вычислений значительно хуже, чем при использовании встроенных типов и двоичной арифметики, но в некоторых случаях, когда точность намного важнее скорости - модуль незаменим, несмотря на вынужденно громоздкую запись арифметических выражений (из-за необходимости использовать вызовы функций вместо операторов арифметики).

Модуль разрабатывался для Delphi 5, но работает так же и в Delphi 6, и должен работать в Delphi 7. В более поздних версиях Delphi и его клонов не тестировался.

Подробное описание

Модуль содержит определение одного типа TDecimal и некоторый набор функций для работы с ним. Тип TDecimal определяется как структура:
TDecimal = packed record
    Exponent: SmallInt;
    Negative: Boolean;
    Mantissa: array[ 0..MaxDigits-1 ] of Byte;
end;

Здесь MaxDigits - это константа, определяемая в модуля. Ее значение 37, что означает 37 значащих десятичных цифр. Если требуется другое значение, константу лучше здесь же, в теле модуля и изменить.

Соответственно, одна переменная типа TDecimal может быть присвоена другой, при этом компилятор сформирует код, который просто скопирует содержимое присваиваемой переменной (40 байт в памяти).

Список функций модуля
 
Декларация Описание
function Int2Decimal( i: Integer ): TDecimal; Конвертирует целое в десятичное.
function Decimal2Int( const d: TDecimal ): Integer; Конвертирует десятичное в целое, отбрасывая дробную часть.
function Float2Decimal( E: Extended ): TDecimal; Конвертирует вещественное в десятичное. Лучше использовать только для присваивания начальных значений переменных, и вычисления в двоичной и десятичной системах не смешивать.
function Decimal2Float( const d1: TDecimal ): Extended; Конвертирует десятичное в вещественное. Скорее всего, возможна потеря точности.
function Str2Decimal( const s: String ): TDecimal; Конвертирует число из строкового представления в десятичное. Число должно быть записано в так называемой научной форме, с символом E или e в качестве разделителя экспоненты.
function Decimal2Str( const d1: TDecimal; MaxFixedWidth: Integer = MaxDigits + 2 ): String; Конвертирует десятичное в строку. Если задано такое значение MaxFixedWidth, что все число не входит, то используется научный формат с экспонентой, отделяемой символом E от мантиссы.
function DecimalFormat( const fmt: String; const d1: TDecimal ): String; Еще одна функция форматирования десятичного в строку. Допустимые форматы задаются следующей БНФ-формой: [%][+|-][0]w.d[E], где w - общее число знаков (при наличии ведущего нуля в форме недостающие позиции спереди заполняются нулями), d - число знаков после десятичной точки. Если d = 0, то точка так же не ставится, число округляется до целых.
function IsDecimalZero( const d1: TDecimal ): Boolean; Возвращает TRUE, если заданное десятичное равно нулю.
function DecimalCompare( const d1, d2: TDecimal ): Integer; Сравнивает два десятичных, возвращает -1 (d1 < d2), 0 (d1 = d2) или от 1 до 9 (d1 > d2).
function DecimalCompare0( const d1: TDecimal ): Integer; Сравнивает десятичное с нулём: -1 (d1 < 0), 0 (d1 = 0), от 1 до 9 (d1 > 0).
function DecimalAdd( const d1, d2: TDecimal ): TDecimal; Складывает два десятичных, возвращает сумму.
function DecimalSub( const d1, d2: TDecimal ): TDecimal; Вычитает из d1 второе десятичное d2, возвращает разность.
function NegateDecimal( const d1: TDecimal ): TDecimal; Возвращает -d1 в качестве результата.
function DecimalMul( const d1, d2: TDecimal ): TDecimal; Возвращает произведение d1 * d2.
function DecimalDiv( const d1, d2: TDecimal ): TDecimal; Возвращает результат деления d1 / d2. На ноль, вообще, делить нельзя. Но если в свойствах проекта определить символ условной компиляции NO_DECIMAL_EXCEPTIONS, то будет возвращено значение 0 в этом случае.
function DecimalRound( const d1: TDecimal; LeaveDigits: Integer ): TDecimal; Округляет d1 до указанного числа знаков после запятой, и возвращает округлённый результат. Гарантируется соответствии правилам арифметики.
function DecimalTrunc( const d1: TDecimal; LeaveDigits: Integer ): TDecimal; Отбрасывает все десятичные знаки, кроме указанного количества, возвращает обрезанный результат.
function DecimalRoot( const d1: TDecimal ): TDecimal; Извлекает корень квадратный из десятичного.
function DecimalSquare( const d1: TDecimal ): TDecimal; Возводит d1 в квадрат для получения результата.

 


(C) by Vladimir Kladov, 2000-2010