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