Разное

Decimal тип данных: Тип данных Decimal — Visual Basic

Содержание

Тип данных Decimal — Visual Basic



  • Чтение занимает 2 мин

В этой статье

Содержит 128-разрядные (16-байтные) значения со знаком, представляющие 96-разрядные (12-байтные) целые числа с переменной степенью, кратной 10.Holds signed 128-bit (16-byte) values representing 96-bit (12-byte) integer numbers scaled by a variable power of 10. Коэффициент масштабирования определяет количество цифр справа от десятичной запятой. Он находится в диапазоне от 0 до 28.The scaling factor specifies the number of digits to the right of the decimal point; it ranges from 0 through 28. С масштабом 0 (без десятичных знаков) максимально возможное значение — +/-79,228,162,514,264,337,593,543,950,335 (+/-7.9228162514264337593543950335E + 28).With a scale of 0 (no decimal places), the largest possible value is +/-79,228,162,514,264,337,593,543,950,335 (+/-7.9228162514264337593543950335E+28). С 28 десятичными разрядами максимальное значение — +/-7.9228162514264337593543950335, а наименьшее ненулевое значение — +/-0,0000000000000000000000000001 (+/-1E-28).With 28 decimal places, the largest value is +/-7.9228162514264337593543950335, and the smallest nonzero value is +/-0.0000000000000000000000000001 (+/-1E-28).

КомментарииRemarks

DecimalТип данных предоставляет наибольшее количество значащих цифр для числа.The Decimal data type provides the greatest number of significant digits for a number. Он поддерживает до 29 значащих цифр и может представлять значения, превышающие 7,9228 x 10 ^ 28.It supports up to 29 significant digits and can represent values in excess of 7.9228 x 10^28. Он особенно подходит для вычислений, например финансовых, которые нуждаются в большом количестве цифр, но не могут допускать ошибки округления.It is particularly suitable for calculations, such as financial, that require a large number of digits but cannot tolerate rounding errors.

Значение по умолчанию для типа Decimal — 0.The default value of Decimal is 0.

Советы по программированиюProgramming Tips

  • Обеспечивают.Precision. Decimalне является типом данных с плавающей запятой.Decimal is not a floating-point data type. DecimalСтруктура содержит двоичное целочисленное значение, а также бит знака и целочисленный коэффициент масштабирования, указывающий, какая часть значения является десятичной дробью.The Decimal structure holds a binary integer value, together with a sign bit and an integer scaling factor that specifies what portion of the value is a decimal fraction. По этой причине Decimal числа имеют более точное представление в памяти, чем типы с плавающей запятой ( Single и Double ).Because of this, Decimal numbers have a more precise representation in memory than floating-point types (Single and Double).

  • Производительность.Performance. DecimalТип данных является самым медленным из всех числовых типов.The Decimal data type is the slowest of all the numeric types. Перед выбором типа данных следует оценить важность точности в соответствии с производительностью.You should weigh the importance of precision against performance before choosing a data type.

  • Расширяющие.Widening. DecimalТип данных расширяется до Single или Double .The Decimal data type widens to Single or Double. Это означает, что можно преобразовать Decimal в любой из этих типов без возникновения System.OverflowException ошибки.This means you can convert Decimal to either of these types without encountering a System.OverflowException error.

  • Нули в конце.Trailing Zeros. Visual Basic не сохраняет конечные нули в Decimal литерале.Visual Basic does not store trailing zeros in a Decimal literal. Однако Decimal переменная сохраняет все конечные нули, полученные при вычислении.However, a Decimal variable preserves any trailing zeros acquired computationally. Это показано в следующем примере.The following example illustrates this.

    Dim d1, d2, d3, d4 As Decimal
    d1 = 2.375D
    d2 = 1.625D
    d3 = d1 + d2
    d4 = 4.000D
    MsgBox("d1 = " & CStr(d1) & ", d2 = " & CStr(d2) &
          ", d3 = " & CStr(d3) & ", d4 = " & CStr(d4))
    

    Выходные данные MsgBox в предыдущем примере имеют следующий вид:The output of MsgBox in the preceding example is as follows:

    d1 = 2.375, d2 = 1.625, d3 = 4.000, d4 = 4
    
  • Символы типа.Type Characters. При добавлении к литералу символа типа литерала D производится принудительное приведение литерала к типу данных Decimal.Appending the literal type character D to a literal forces it to the Decimal data type. При добавлении символа идентификатора типа @ к любому идентификатору производится принудительное приведение этого идентификатора к типу Decimal.Appending the identifier type character @ to any identifier forces it to Decimal.

  • Тип Framework.Framework Type. В .NET Framework данный тип соответствует структуре System.Decimal.The corresponding type in the .NET Framework is the System.Decimal structure.

ДиапазонRange

Может потребоваться использовать D символ типа, чтобы присвоить большое значение Decimal переменной или константе.You might need to use the D type character to assign a large value to a Decimal variable or constant. Это требование обусловлено тем, что компилятор интерпретирует литерал как Long , если символ типа литерала не соответствует литералу, как показано в следующем примере.This requirement is because the compiler interprets a literal as Long unless a literal type character follows the literal, as the following example shows.

Dim bigDec1 As Decimal = 9223372036854775807   ' No overflow.
Dim bigDec2 As Decimal = 9223372036854775808   ' Overflow.
Dim bigDec3 As Decimal = 9223372036854775808D  ' No overflow.

Объявление для bigDec1 не создает переполнение, так как присваиваемое ему значение попадает в диапазон для Long .The declaration for bigDec1 doesn’t produce an overflow because the value that’s assigned to it falls within the range for Long. LongЗначение может быть присвоено Decimal переменной.The Long value can be assigned to the Decimal variable.

Объявление для bigDec2 создает ошибку переполнения, так как присвоенное ей значение слишком велико для Long .The declaration for bigDec2 generates an overflow error because the value that’s assigned to it is too large for Long. Поскольку числовой литерал не может быть интерпретирован как Long , он не может быть назначен Decimal переменной.Because the numeric literal can’t first be interpreted as a Long, it can’t be assigned to the Decimal variable.

Для bigDec3 символ типа литерала D решает проблему, вызывая компилятору интерпретировать литерал как, Decimal а не как Long .For bigDec3, the literal type character D solves the problem by forcing the compiler to interpret the literal as a Decimal instead of as a Long.

См. также разделSee also

Тип данных Decimal | Microsoft Docs



  • Чтение занимает 2 мин

В этой статье

Переменные типа Decimal хранятся в виде 96-разрядных (12-байтовых) целых чисел без знака, а также с коэффициентом масштабирования (используется для указания на степень числа 10 для масштабирования целого числа вниз или при отсутствии масштабирования), а также значение, указывающее, является ли десятичное число положительным или отрицательным.Decimal variables are stored as 96-bit (12-byte) unsigned integers, together with a scaling factor (used to indicate either a whole number power of 10 to scale the integer down by, or that there should be no scaling) and a value indicating whether the decimal number is positive or negative.

Коэффициент масштабирования — это количество цифр, которые должны храниться справа от десятичной точки, и диапазон от 0 до 28.The scaling factor is the number of digits to store to the right of the decimal point, and ranges from 0 to 28.

  • Если задается масштаб 0 (без десятичных знаков), наибольшее возможное значение равно +/-79 228 162 514 264 337 593 543 950 335.With a scale of 0 (no decimal places), the largest possible value is +/-79,228,162,514,264,337,593,543,950,335.

  • С масштабом 28 десятичных разрядов максимальное значение — +/-7.9228162514264337593543950335, а наименьшее ненулевое значение — +/-0,0000000000000000000000000001.With a scale of 28 decimal places, the largest value is +/-7.9228162514264337593543950335 and the smallest, non-zero value is +/-0.0000000000000000000000000001.

Примечание

В настоящее время тип данных Decimal можно использовать только в пределах Variant; то есть невозможно объявить переменную с типом Decimal.At this time, the Decimal data type can only be used within a Variant; that is, you cannot declare a variable to be of type Decimal. Однако можно создать Variant , подтип которого имеет тип Decimal , с помощью функции CDec .You can, however, create a Variant whose subtype is Decimal by using the CDec function.

См. такжеSee also

Поддержка и обратная связьSupport and feedback

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи?Have questions or feedback about Office VBA or this documentation? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.



Иллюстрированный самоучитель по SQL для начинающих › Основы SQL [страница — 14] | Самоучители по программированию

Основы SQL

Тип BIGINT

Тип данных BIGINT (большой целый) – это новый тип данных, появившийся вместе с SQL:2003. Он также предназначен для целых значений и определяется как тип, точность которого может быть не намного больше, чем точность данных типа INTEGER, или сильно превышать ее. Предел точности данных типа BIGINT зависит от реализации.

Тип NUMERIC

В данных типа NUMERIC (числовой), кроме целого компонента, может быть и дробный. Для этих данных можно указать точность и масштаб. Точность, как вы помните, – это максимально возможное количество цифр.

Масштаб – это количество цифр после запятой. Масштаб не может быть отрицательным или превышать точность числа.

При определении типа NUMERIC необходимо указать требуемые значения точности и масштаба. В определении можно указать только NUMERIC и получить значения по умолчанию. А если вы укажете NUMERIC (p), то получите требуемую точность и значение масштаба по умолчанию. Выражение NUMERIC (p,s) позволяет непосредственно задать и точность, и масштаб. При определении данных вместо параметров p и s нужно ввести соответственно требуемые значения точности и масштаба.

Скажем, например, что в вашей реализации SQL точность по умолчанию для типа данных NUMERIC равна 12, а масштаб по умолчанию равен 6. Если вы укажете, что столбец базы данных имеет тип NUMERIC, то в этом столбце смогут находиться числа вплоть до 999999.999999. Если же, с другой стороны, вы для столбца указываете тип данных NUMERIC (10), то в столбце смогут находиться только числа с максимальным значением 9999.999999. Параметр (10) указывает максимально возможное для числа количество цифр. Когда для столбца будет указан тип данных NUMERIC (10.2), то в столбце могут находиться числа с максимальным значением – 99999999.99. В этом случае хотя и останется всего десять цифр, но справа от десятичной запятой будут находиться только две из них. (Имейте в виду, что синтаксис SQL требует использовать для разделения целой и дробной частей числа не запятую, а десятичную точку, как это принято в США и странах Европы.)

Тип данных NUMERIC предназначен для значений, таких как 595.72. Точность этого значения равна 5 (общее количество цифр), а масштаб – 2 (количество цифр справа от десятичной запятой). Для чисел, таких, как это, подходит тип данных NUMERIC (5.2).

Тип DECIMAL

Тип данных DECIMAL (десятичный) похож на NUMERIC. В нем может быть дробная часть, и для него можно указать точность и масштаб. DECIMAL отличается от NUMERIC тем, что если точность имеющейся реализации SQL будет больше указанного значения, то в реализации будет использоваться большая точность. А если точность или масштаб не указаны, то, как и при использовании типа NUMERIC, в реализации применяются значения по умолчанию.

В столбце, тип которого NUMERIC (5.2), нельзя поместить числа, большие 999.99. Если же тип столбца DECIMAL (5.2), в него всегда можно поместить значения до 999.99. Кроме того, если точность реализации позволяет, то СУБД сможет поместить в этот столбец и значения, большие, чем 999.99.

Если в ваших данных имеются дробные части, тогда применяйте тип NUMERIC или DECIMAL, а если ваши данные всегда состоят из целых чисел, то используйте тип INTEGER или SMALLINT. Когда нужно добиться максимальной переносимости, следует использовать тип NUMERIC, потому что поле, тип которого вы определите, например, как NUMERIC (5.2), будет во всех системах иметь один и тот же диапазон значений.

Приблизительные числовые типы

У некоторых величин имеется такой большой диапазон возможных значений (большое количество порядков), что компьютер с данным размером регистра не может в точности представить все эти значения. (Размерами регистра являются, например, 32 бита, 64 бита и 128 бит.) Обычно в таких случаях точность не является необходимой, и поэтому будет достаточно иметь близкое приближение. Для работы с такими данными SQL:2003 определяет три приблизительных числовых типа.

Тип REAL

Тип данных REAL (действительное число) дает возможность задавать числа однократной точности с плавающей запятой, точность которых зависит от реализации. Вообще-то, точность определяется используемым оборудованием. Например, 64-битовая машина дает большую точность, чем 32-битовая.

Число с плавающей запятой (floating – point number) – это число с десятичной запятой Десятичная запятая «плавает» или появляется в разных частях числа, в зависимости от значения этого числа. Примерами чисел с плавающей запятой являются 3.1, 3.14 и 3.14159.

VBA Excel. Тип данных Decimal

Тип данных Decimal используется в VBA Excel только внутри типа Variant. Максимальное общее количество значащих цифр до запятой и после нее равно 29.

Определение типа данных Decimal

Decimal – это числовой тип данных, предназначенный для проведения вычислений, требующих высокой точности и не допускающих автоматического перевода в экспоненциальную форму. Он поддерживает до 29 значащих цифр в числе, независимо от положения запятой.

Decimal не является типом данных с плавающей запятой, в отличие от типов Single и Double. Он содержит целое двоичное значение вместе с битом знака и целочисленным коэффициентом масштабирования, который указывает, какая часть значения представляет дробную часть.

Decimal является самым медленным по производительности числовым типом данных, но числа в его формате имеют более точное представление в памяти, чем типы с плавающей запятой.

В настоящее время в VBA Excel нет отдельного типа данных Decimal, но он доступен внутри типа Variant. Для получения числа типа Decimal и присвоения его переменной типа Variant используется функция CDec. Длинное число перед преобразованием в Decimal должно быть в текстовом формате.

Если число типа Decimal записать в ячейку рабочего листа общего формата, оно будет автоматически преобразовано в экспоненциальную форму. Чтобы этого не случилось, ячейке необходимо назначить текстовый формат, а число перед записью конвертировать в строку.

Диапазон чисел типа Decimal

  • Максимальное значение числа без дробных разрядов: +/-79228162514264337593543950335 (+/-7,9228162514264337593543950335E+28).
  • Наибольшее значение числа с 28 десятичными знаками: +/-7,9228162514264337593543950335.
  • Наименьшее ненулевое значение: +/-0,0000000000000000000000000001 (+/-1E-28).

Тип данных Decimal может использоваться в финансовой сфере и при научных вычислениях. На практике, для большинства расчетов, применяются менее точные числовые типы данных.

Пример кода в VBA Excel

Присвоим с помощью кода VBA Excel максимальные по длине числа типа данных Decimal переменным, проведем математическую операцию с числами и запишем ее результат в ячейки рабочего листа с преобразованием значения в текст и без преобразования:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

Sub Primer()

Dim a, b, c, d, e, f

‘Присваиваем переменным a, b и c значения типа Decimal

a = CDec(«79228162514264337593543950335»)

b = CDec(«7,9228162514264337593543950335»)

c = CDec(«0,0000000000000000000000000001»)

‘Вычисляем математическое выражение

d = a / (3 * b)

‘Назначаем ячейке A1 текстовый формат

Cells(1, 1).NumberFormat = «@»

‘Присваиваем ячейке A1 преобразованное в строку

‘значение переменной d

Cells(1, 1) = CStr(d)

‘Присваиваем ячейке A2 общего формата значение Decimal

Cells(2, 1) = d

‘Присваиваем значения ячеек A1 и A2, преобразованные

‘в тип данных Decimal, переменным e и f

e = CDec(Cells(1, 1))

f = CDec(Cells(2, 1))

‘На строку End Sub устанавливаем значок паузы

End Sub

Что записалось в переменные, смотрите в окне Locals:

Обратите внимание, что в ячейке A2 значение типа Decimal было автоматически преобразовано в экспоненциальный формат с обрезанием числа. После обратного преобразования его в Decimal, на месте обрезанной части отображены нули.

Decimal числа. Отличия от float

После рассказа про float меня просили рассказать про Decimal. Узнаем же, что это за зверь, как он устроен внутри и как с ним работать. Итак, Decimal – это класс из стандартного модуля decimal. Он представляет собой число с плавающей точкой, как и float. Да, именно с плавающей, потому что некоторые, я слышал, думают, что это число с фиксированной точкой.

Однако, Decimal имеет ряд существенных отличий от float.

Цель

Тип Decimal создан, чтобы операции над рациональными числами в компьютере выполнялись также, как они выполняются людьми, как их преподают в школе. Иными словами, чтобы все-таки 0.1 + 0.1 + 0.1 == 0.3. Из-за ошибок представления, float приводит к утере точности, и такие простые на первый взгляд равенства не выполняются. А это может быть критично в высокоточных научных вычислениях, и главное в сфере бизнеса и финансов!

Внутреннее устройство

float – реализован по стандарту IEEE-754 как число с плавающей запятой двойной точности (64 бита) на основании 2. Реализация таких чисел заложена прямо в железо почти любого современного процессора. Поэтому float в Python работает примерно также, как и double в С, С++, Java и прочих языках. И имеет такие же ограничения и «странности». Так как поддержка float имеет аппаратный характер, то его быстродействие сравнительно велико.

Decimal – число с плавающей точкой с основанием экспоненты – 10, отсюда и название (decima лат. – десятая часть, десятина).

Он реализован по стандарту IBM: General Decimal Arithmetic Specification Version 1.70 – 7 Apr 2009, который в свою очередь основан на стандартах IEEE. По поводу реализации, в исходниках CPython я нашел два варианта: на чистом Python и с помощью Си-библиотеки libmpdec. Обе реализации есть в кодовой базе, хотя в последних версиях Python 3 используется именно Си-версия, очевидно, она в разы быстрее! Видите букву Си?

Python 3.7.5 (default, Nov 13 2019, 14:05:23)
[Clang 11.0.0 (clang-1100.0.33.12)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import decimal
>>> help(decimal)

Help on module decimal:

NAME
    decimal - C decimal arithmetic module
...

Поэтому первый важный вывод:

Хоть Decimal и написан на Си, он в разы медленнее, чем float, так как реализован программно, а float – аппаратно.

Когда, речь идет о деньгах, считать много обычно не требуется, зато требуется точность, иначе просто ваш баланс не сойдется. Представьте, что в банке вы не можете снять свой миллион, потому что из-за ошибки у вас не хватает одной триллионной копейки? Абсурдно же.

Теперь самое главное – основание 10. Оно позволяет записывать десятичные дроби точно, без ошибок представления.

Decimal_Число = ±мантисса * 10 экcпонента

Мантисса и экспоненты – целые числа.

Помните, что мы не могли представить 0.1 в float с основанием 2? С основанием 10 – это элементарно:

0.1 = 1 * 10-1, и таким образом, 0.3 = 3 * 10-1 = (1 + 1 + 1) * 10-1 = 0.1 + 0.1 + 0.1

Как мы в школе учили десятичные дроби и знаем, как оперировать ими, так и здесь. Все точно и привычно. Ну почти все. Если мы разделим единицу на тройку, то получим бесконечную периодическую дробь 0.33333333…, либо по другому ее пишут 0.(3) – три в периоде. Естественно, что бесконечных чисел, записанных цифрами в памяти компьютера быть не может, иначе бы потребовалась бесконечная память. Поэтому количество троек в записи может быть большим, но обязано быть конечным.

Decimal оперирует с числами с произвольной (задаваемой пользователем), но конечной точностью.

По умолчанию точность – 28 десятичных знаков.

Еще одно следствие того, что Decimal реализовано программно – то, что его можно на ходу настраивать, как угодно пользователю. Для этого есть контекст – объект, содержащий настройки для выполнения операций и флаги. Операции выполняемые в этом контексте следуют правилам, заданным в нем. В отличии от float, где все правила фиксированы на аппаратном или низшим программным уровнях. Настроить можно:

  • Точность выполнения операций в количестве десятичных знаках
  • Режимы округления (их целых 8 штук)
  • Пределы по экспоненте
  • Режимы обработки исключительных ситуаций – настройки сигналов (например, деление на ноль, переполнение и прочее).

Флаги в контексте устанавливаются со стороны модуля decimal, если при последнем вычислении случился какой-то из сигналов. (Это отдельная тема, о ней потом.)

Сам же объект Decimal содержит знак, мантиссу (коэффициент перед экспонентой) и саму экспоненту (степень). Лишние нули в мантиссе на обрезаются, чтобы сохранять значимость числа (1.20 * 2.40 = 2.8800).

Decimal – иммутабельный (неизменяемый) тип. Операции над ним приводят к созданию новых объектов, а старые не меняются.

Поработаем с Decimal

Начинаем с импорта и посмотрим, каков контекст по умолчанию:

>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])

Мы видим здесь, что точность 28 знаков, округление к ближайшему четному, пределы по экспоненте ±999999, capitals – это про заглавную Е при печати, clamp не будем трогать пока что, флаги все сброшены, а включенные ловушки – неправильная операция, деление на ноль, переполнение. Если ловушка включена, это значит, что при возникновении соответствующего сигнала будет брошено исключение. Если нет ловушки, то при сигнале будет только втихую установлен флаг. Я оставлю тему ловушек на следующую статью.

Создание Decimal

Создать Decimal можно из обычного целого числа, из float, из строки или кортежа. С обычным числом все просто – int представлены и так точно:

>>> Decimal(1)
Decimal('1')
>>> Decimal(-1)
Decimal('-1')
>>> Decimal(10002332)
Decimal('10002332')

Из float – надо быть очень аккуратным. Потому что, float округляется внутри до ближайшего возможного, а Decimal не знает о ваших первоначальных намерениях, поэтому копирует содержимое float. К примеру, числа 0.1 в представлении float просто не существует. Python считывает 0.1 из кода как строку, потому ищет наиболее близкий к нему возможный float, а из него уже копируется содержимое в Decimal, как есть – уже с ошибкой:

>>> Decimal(0.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')

Не рекомендуется создавать Decimal из float. В Decimal попадет уже неправильно округленное число. Создавайте Decimal из целых чисел, либо из строк!

Логически правильно создавать Decimal сразу из строки, избегая фазу с превращением его в float! Что есть в строке – попадет в Decimal. Может показаться, что это немного криво – хранить числах в строках, но теперь вы знаете о представлении двоичного float, и строки обретают реальный смысл.

>>> Decimal('0.1')
Decimal('0.1')
>>> Decimal('3.14')
Decimal('3.14')
>>> Decimal('1.2e+10')
Decimal('1.2E+10')
>>> Decimal('10_000_000_000')  # c версии Python 3.6 можно подчеркивания
Decimal('10000000000')

Можно строкой еще задавать бесконечности и NaN (не число). Примеры:

>>> Decimal('Inf')
Decimal('Infinity')
>>> Decimal('-Inf')
Decimal('-Infinity')
>>> Decimal('nan')
Decimal('NaN')

Если использовать кортеж для конструирования Decimal, то он должен содержать три элемента:

  1. Знак, как число: 0 – это плюс, 1 – это минус.
  2. Кортеж из значащих цифр мантиссы
  3. Число – показатель экспоненты

Вообще кортеж для Decimal использует редко. Но вот вам пример:

>>> Decimal((0, (1, 2, 3, 4, 5), -1))
Decimal('1234.5')
>>> Decimal((1, (7, 7, 7), 3))
Decimal('-7.77E+5')

Если число слишком большое, то будет сигнал – неправильная операция. А так как на этом сигнале ловушка по умолчание – то будет исключение:

>>> Decimal("1e9999999999999999999")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
decimal.InvalidOperation: [<class 'decimal.InvalidOperation'>]

Точность представление Decimal задается исключительно длиной задающего числа (или длиной строки). Настройки точности и режимов округления из контекста в ступают в игру только во время совершения математических операций.

>>> с = Context(prec=3)  # точность 3
>>> Decimal('5.643434231', c)  # но число целиком сохраняется
Decimal('5.643434231')

>>> Decimal('5.643434231', c) * 2  # после операции уже применяется округление до нужной точности
Decimal('11.287')

>>> +Decimal('5.643434231', c)  # трюк: унарный плюс применит контекст
Decimal('5.6434')

Decimal отлично интегрирован в среду Python. Что касается математики, то с Decimal работают все привычные операции: сложение, вычитание, умножение, деление, возведение в степень и так далее.

Работайте с Decimal как с обычными числами: складывайте, вычитайте, умножайте, делите и прочее. Можете, миксовать их с целыми числами. Но не рекомендуется миксовать их с float.

>>> x = Decimal('1.2')
>>> y = Decimal('2.3')
>>> x + y
Decimal('3.5')
>>> x - y
Decimal('-1.1')
>>> x * y
Decimal('2.76')
>>> x / y
Decimal('0.52174')

>>> y // x  # деление нацело
Decimal('1')
>>> y % x  # остаток
Decimal('1.1')

>>> Decimal('2.2') * 2
Decimal('4.4')
>>> Decimal('2.2') - 1
Decimal('1.2')

Дополнительно еще доступны некоторые математические функции:

>>> getcontext().prec = 10  # просто точность задали

>>> Decimal(2).sqrt()  # корень квадратный
Decimal('1.414213562')

>>> Decimal(2).ln()  # логарифм натуральный
Decimal('0.6931471806')

>>> Decimal(100).log10()  # логарифм десятичный
Decimal('2')

А вот чисел π и e из коробки не завезли, потому что не ясно, какая точность вам нужна. Их можно взять из модуля math в виде float или задать вручную до нужной точности или на худой конец вычислить. Аналогично для тригонометрии и специальных функций: либо берите неточные значения из math, либо вычисляйте сами до нужной точности рядами Тейлора или другими методами с помощью примитивных операций. В документации есть примеры вычисления констант и функций.

Кстати, Decimal можно передавать как аргументы функций, ожидающих float. Тогда они будут преобразованы во float:

>>> math.sin(Decimal(1))
0.8414709848078965

Метод quantize округляет число до фиксированной экспоненты, полезно для финансовых операций, когда нужно округлить копейки (центы). Первый аргумент – Decimal – что-то вроде шаблона округления. Смотрите примеры:

>>> Decimal('10.4266').quantize(Decimal('.01'), rounding=ROUND_DOWN)
Decimal('10.42')
>>> Decimal('10.4266').quantize(Decimal('.01'), rounding=ROUND_UP)
Decimal('10.43')
>>> Decimal('10.4266').quantize(Decimal('1.'), rounding=ROUND_UP)
Decimal('11')

Кроме того Decimal можно сравнивать между собой, как обычные числа. Причем допускается сравнивать даже на точное равенство:

>>> x = Decimal('0.1')
>>> x + x + x == Decimal('0.3')
True

Можно сортировать списки Decimal, искать минимум и максимум. А также преобразовывать Decimal обратно в обычные типы int, float, str. Пример из документации:

>>> data = list(map(Decimal, '1.34 1.87 3.45 2.35 1.00 0.03 9.25'.split()))
>>> max(data)
Decimal('9.25')
>>> min(data)
Decimal('0.03')
>>> sorted(data)
[Decimal('0.03'), Decimal('1.00'), Decimal('1.34'), Decimal('1.87'),
 Decimal('2.35'), Decimal('3.45'), Decimal('9.25')]
>>> sum(data)
Decimal('19.29')
>>> a, b, c = data[:3]
>>> str(a)
'1.34'
>>> float(a)
1.34
>>> round(a, 1)
Decimal('1.3')
>>> int(a)
1

Но! Не все сторонние библиотеки поддерживают Decimal. Например, не получится использовать его для numpy!

Не все операции над Decimal абсолютно точные, если результат неточен, то возникает сигнал Inexact.

>>> c = getcontext()
>>> c.clear_flags()

>>> Decimal(1) / Decimal(3)
Decimal('0.3333333333')

>>> c.flags[Inexact]
True

Выводы

Выбор между Decimal и float – это поиск компромисса с учетом условий конкретной задачи.

Если вам нужно считать очень много (симуляции, физика, химия, графика, игры), то иногда имеет смысл отказаться от точности Decimal в пользу скорости и компактности хранения данных у float. В бизнесе и финансах считать приходится не очень много, но нужно делать это предельно точно, тогда ваш взгляд должен обратиться в сторону Decimal. В таблице вы найдете сравнение этих двух типов данных.

Примечание: а для целочисленных вычислений может сгодится и простой int, он умеет из коробки длинную математику!

Еще

В этой статье я не осветил полностью вопросы:

  • Сигналы, флаги и ловушки
  • Обзор режимов округления
  • Управление контекстами
  • Контексты и многопоточность

Если сообществу будет интересно, то я продолжу тему. Голосование будет на канале!

Специально для канала @pyway. Подписывайтесь на мой канал в Телеграм @pyway 👈 




947

Числовой тип данных Decimal и точность вычислений в Swift – Swiftme.ru

Когда вы работаете с целочисленными типами, для вас и ваших программ нет никаких проблем с точностью вычисления. Число 2 помноженное на 99 всегда будет 198, а 10 деленное на 2 – однозначно равняется 5. Но рано или поздно вы придете к необходимости применения чисел с плавающей запятой, т.е. чисел с дробной частью. И в некоторых случаях это может привести к неожиданным проблемам. Рассмотрим пример из листинга 1.1.

Листинг 1.1

var wallet: Float = 0
let productPrice: Float = 0.01

Переменная wallet описывает ваш кошелёк, а productPrice – стоимость товара, который вы продаёте.

Что будет, если вы продадите 100 единиц товара? Конечно же в вашем кошельке появится 1 рубль (листинг 1.2).

В следующем листинге используется еще не рассмотренная нами конструкция for-in. Это так называемый цикл, который позволяет выполнить вложенные в него выражения необходимое количество раз. Далее мы подробно рассмотрим широкие возможности for-in.

Листинг 1.2

for _ in 1...100 {
wallet += productPrice
}
wallet // 0.9999999993

Но что мы видим? По какой-то причине вместо числа 1.0 мы получили очень приближенное к нему, но отличающееся от задуманного, значение 0.9999999993.

Причина этому в особенностях работы компьютера с дробными числами. Как вы знаете, любое число в конечном счёте рассматривается компьютером, как совокупность 0 и 1. Так число 2 – это 10, число 13 – это 1101 и т.д. компьютеру очень просто и удобно оперировать с такими числами, перемножать их, вычитать, делить, ну и собственно, проводить любые математические (и логические) операции.

Когда число представлено в форме 0 и 1 говорят, что оно имеет базу 2, то есть два числа, с помощью которых представляется. Так числа в разных системах счисления имеют различную базу: у шестнадцатиричной – база 16, у десятиричной – база 10 и т.д. Но какие бы вы не использовали системы счисления в своих программах – для компьютера они будут выглядеть, как числа из 0 и 1, т.е. будет иметь базу два.

Ошибки в точности вычислений возникают, когда вы работаете с числами с плавающей запятой. В некоторых случаях компьютер не может точно представить число в двоичной форме, и использует максимально близкое, приближенное по значению. Так было и в случае с productPrice. Нет числа в двоичной форме, которое бы представило без ошибок 0,01. И таких примеров практически бесконечное множество.

О переводе чисел с плавающей точкой из десятичной в двоичную систему счисления вы можете прочитать самостоятельно. В сети полно примеров с подробным объяснением процесса.

Теперь представьте, что вы разрабатываете биржу криптовалюты. Пользователи проводят операции с биткоином, ошибка накапливается, и внезапно вы становитесь аферистом, мошенником, и все потому что просто использовали не правильный тип данных.

Не правильный тот тип? – спросите вы – А что существует правильный тип?

Да, в Swift есть числовой тип данных, который позволяет проводить операции с дробными числами без потери точности вычислений. Он называется Decimal. Попробуем поменять тип параметров из листингов выше с Float на Decimal, и посмотрим на результат (листинг 1.3)

Листинг 1.3

import Foundation
var wallet: Decimal = 0
let productPrice: Decimal = 0.01
for _ in 1...100 {
    wallet += productPrice
    
}
wallet // 1

Обратите внимание, что в коде должно присутствовать выражение import Foundation. О его предназначении мы поговорим позже, но если коротко, то с его помощью обеспечивается подключение библиотеки функций, в состав которой входят многие дополнительные типы данных и функции. Тип Decimal не является фундаментальным, для его работы необходима дополнительная библиотека (Foundation).

Как вы можете видеть, проблема ушла. Количество денег в кошельке ровно то, какое мы и ожидали.

Decimal отличается от Float и Double тем, что с его помощью можно оперировать и проводить операции с числами с базой 10. Данный тип обслуживается не просто аппаратной частью вашего компьютера, где из десятичного числа получается двоичное (и вместе с этим преобразованием возникают и ошибки в точности). В интересах Decimal функционируют специальные программные компоненты, которые обеспечивают точность. Конечно на нижнем уровне (в процессоре) числа все равно состоят из 0 и 1, но сложная логика работы этих специальных компонентов компенсирует все возникающие ошибки.

Но у данного решения существует и обратная сторона – тип Decimal работает значительно медленнее, чем Float или Double. Не стоит использовать Decimal повсеместно. Но где именно стоит его применять?

В случаях, когда значения могут быть измерены (например физические величины) применяйте Float и Double. В случаях, когда значения могут быть сосчитаны (например деньги) – используйте Decimal.

Будьте осторожны с физическими величинами, для которых критически важна точность вплоть до стотысячных, миллионных долей и т.д.

1.2. Изменения типа данных DECIMAL. MySQL: руководство профессионала

1.2. Изменения типа данных DECIMAL

Этот раздел обсуждает характеристики типа данных DECIMAL (и синонимов) в MySQL 5.1, со специфическим отношением к следующим темам

Максимальное число цифр

Формат хранения

Требования к памяти

Ненормативное MySQL расширение к верхнему диапазону столбцов DECIMAL

Возможные несовместимости с прикладными программами, которые написаны для старых версий MySQL, отмечены в этом разделе.

Синтаксис объявления для столбца DECIMAL: DECIMAL(M,D). Диапазоны значений для параметров в MySQL 5.1 следующие:

M: максимальное число цифр (точность). Это имеет диапазон от 1 до 65. Старые версии MySQL позволяли диапазон от 1 до 254.

D: число цифр направо от десятичной точки (масштаб). Это имеет диапазон от 0 до 30 и должно быть не больше, чем M.

Максимальное значение 65 для M означает, что вычисления на значениях DECIMAL точны до 65 цифр. Это ограничение точности в 65 цифр также применяется к числовым литералам с точным значением, так что оно задает максимальный диапазон таких литералов. В старых версиях MySQL десятичные значения могли иметь до 254 цифр. Однако, вычисления были выполнены, используя числа с плавающей запятой и таким образом были приблизительны, не точны.

Значения для столбцов DECIMAL в MySQL 5.1 сохранены, используя двоичный формат, который упаковывает девять десятичных цифр в четыре байта. Требования к памяти для целочисленных и дробных частей каждого значения определены отдельно. Каждые девять цифр требуют четырех байт, и любые цифры сверх этого требуют некоторой доли четырех байтов. Например, DECIMAL(18,9) имеет девять цифр с обеих сторон десятичной точки, так что целочисленная и дробная части требуют четырех байтов каждая. Столбец DECIMAL(20,10) имеет по десять цифр с обеих сторон десятичной точки. Каждая часть требует четырех байтов для девяти из цифр и одного байта для остающейся цифры.

Память, требуемая для остающихся цифр, показана в следующей таблице:

Остающиеся цифры | Число байтов

0 | 0

1 | 1

2| 1

3 | 2

4 | 2

5 | 3

6 | 3

7 | 4

8 | 4

9 | 4

В отличие от старых версий MySQL (до 5.0.3), столбцы DECIMAL в MySQL 5.1 не сохраняют символ + или цифры 0 в начале значения. Если Вы вставляете +0003.1 в столбец DECIMAL(5,1), это сохранено как 3.1. Прикладные программы, которые полагаются на старое поведение, должны измениться, чтобы обработать это изменение.

Столбцы DECIMAL в MySQL 5.1 не позволяют значения больше, чем диапазон, подразумеваемый по определению столбца. Например, столбец DECIMAL(3,0) поддерживает диапазон от -999 до 999. А столбец DECIMAL(M,D) позволяет M цифр налево от десятичной точки. Это не совместимо с прикладными программами, полагающимися на старые версии MySQL, которые разрешали сохранять дополнительную цифру вместо знака +.

SQL-стандарт требует, чтобы точность NUMERIC(M,D) была точно M цифр. Для DECIMAL(M,D) стандарт требует точности по крайней мере M цифр, но позволяет больше. В MySQL DECIMAL(M,D) и NUMERIC(M,D) то же самое, и оба типа имеют точность ровно M цифр.

Поделитесь на страничке

Следующая глава >

Decimal Тип данных — Visual Basic

  • 2 минуты на чтение

В этой статье

Содержит 128-битные (16-байтовые) значения со знаком, представляющие 96-битные (12-байтовые) целые числа, масштабированные переменной степенью 10. Коэффициент масштабирования определяет количество цифр справа от десятичной точки; он колеблется от 0 до 28.При шкале 0 (без десятичных знаков) максимально возможное значение составляет +/- 79,228,162,514,264,337,593,543,950,335 (+/- 7,9228162514264337593543950335E + 28). С 28 десятичными знаками наибольшее значение составляет +/- 7,9228162514264337593543950335, а наименьшее ненулевое значение составляет +/- 0,0000000000000000000000000001 (+/- 1E-28).

Замечания

Тип данных Decimal обеспечивает наибольшее количество значащих цифр для числа. Он поддерживает до 29 значащих цифр и может представлять значения, превышающие 7.28. Он особенно подходит для расчетов, таких как финансовые, которые требуют большого количества цифр, но не допускают ошибок округления.

Значение по умолчанию Десятичное — 0.

Советы по программированию

  • Точность. Decimal не является типом данных с плавающей запятой. Структура Decimal содержит двоичное целое число вместе со знаковым битом и целочисленным коэффициентом масштабирования, который указывает, какая часть значения является десятичной дробью.Из-за этого числа Decimal имеют более точное представление в памяти, чем типы с плавающей запятой ( Single и Double ).

  • Производительность. Десятичный тип данных — самый медленный из всех числовых типов. Прежде чем выбирать тип данных, вы должны взвесить важность точности и производительности.

  • Расширение. Тип данных Decimal расширяется до Single или Double .Это означает, что вы можете преобразовать Decimal в любой из этих типов без возникновения ошибки System.OverflowException.

  • Конечные нули. Visual Basic не хранит завершающие нули в десятичном значении . Однако переменная Decimal сохраняет любые конечные нули, полученные в результате вычислений. Следующий пример иллюстрирует это.

      Размер d1, d2, d3, d4 в десятичном формате
    d1 = 2,375D
    d2 = 1,625D
    d3 = d1 + d2
    d4 = 4.000D
    MsgBox ("d1 =" & CStr (d1) & ", d2 =" & CStr (d2) &
          ", d3 =" & CStr (d3) & ", d4 =" & CStr (d4))
      

    Вывод MsgBox в предыдущем примере выглядит следующим образом:

      d1 = 2.375, d2 = 1,625, d3 = 4.000, d4 = 4
      
  • Тип символов. Добавление символа типа литерала D к литералу переводит его в тип данных Decimal . Добавление символа типа идентификатора @ к любому идентификатору приводит к установке Decimal .

  • Тип каркаса. Соответствующим типом в .NET Framework является структура System.Decimal.

Диапазон

Может потребоваться использовать символ типа D для присвоения большого значения переменной или константе Decimal .Это требование связано с тем, что компилятор интерпретирует литерал как Long , если только символ типа литерала не следует за литералом, как показано в следующем примере.

  Dim bigDec1 As Decimal = 9223372036854775807 'Нет переполнения.
Dim bigDec2 As Decimal = 9223372036854775808 'Переполнение.
Dim bigDec3 As Decimal = 9223372036854775808D 'Нет переполнения.
  

Объявление bigDec1 не вызывает переполнения, поскольку присвоенное ему значение попадает в диапазон Long .Значение Long можно присвоить переменной Decimal .

Объявление bigDec2 генерирует ошибку переполнения, поскольку присвоенное ему значение слишком велико для Long . Поскольку числовой литерал не может быть сначала интерпретирован как Long , его нельзя присвоить переменной Decimal .

Для bigDec3 символ типа литерала D решает проблему, заставляя компилятор интерпретировать литерал как Decimal вместо Long .

См. Также

.

Общие сведения о типе данных SQL Decimal

Цель этой статьи — познакомить вас с типом данных SQL Decimal и его использованием на различных примерах. Мы также увидим, как использовать этот тип данных в SQL Server, чтобы облегчить работу разработчика SQL.

Введение

Организации ежедневно имеют дело с десятичными числами, и эти десятичные значения можно увидеть повсюду в разных секторах, будь то банки, медицинская промышленность, биометрия, заправочные станции, финансовые отчеты, спорт и многое другое.Использование целых чисел (округлением десятичных чисел) определенно упрощает работу, но часто приводит к неточным выводам, особенно когда мы имеем дело с большим количеством значений и важных данных. В таких сценариях идеально использовать тип данных Sql Decimal в SQL Server для получения правильных результатов с идеальной точностью.

Для разработчиков SQL становится очень важным выбрать правильные типы данных в структуре таблицы при проектировании и моделировании баз данных SQL.Давайте продвинемся вперед и исследуем тип данных Decimal в SQL Server.

Обязательный

Тип данных SQL Decimal используется в SQL Server с незапамятных времен. Вы можете использовать любую установленную версию SQL Server (начиная с 2000 года или выше), чтобы понять этот тип данных. В этой статье мы будем использовать SQL Server 2017 в демонстрационных целях. Если в вашей системе не установлена ​​какая-либо версия и вы хотите попрактиковаться в версии 2017 года, загрузите ее отсюда.

Базовый синтаксис типа данных Decimal в SQL Server

Давайте сначала рассмотрим базовый синтаксис типа данных SQL Decimal.Обозначается это ниже:

Где,

  • p означает точность, общее количество цифр в значении, то есть по обе стороны от десятичной точки.
  • s означает масштаб, количество цифр после десятичной точки.

По умолчанию значение p равно 18, а s равно 0, и для обоих этих значений минимальное значение равно 1, а максимальное — 38.

Короче говоря, определяя параметры в типе данных SQL Decimal, мы оцениваем, сколько цифр будет иметь столбец или переменная, а также количество цифр справа от десятичной точки.

Например, decimal (4,2) указывает, что число будет иметь 2 цифры перед десятичной точкой и 2 цифры после десятичной точки, что-то вроде этого должно быть числовым значением — ##. ##.

Здесь следует отметить одну важную вещь: параметр s (Масштаб) может быть указан только в том случае, если указан p (Точность). Масштаб всегда должен быть меньше или равен точности.

Определение типа данных SQL Decimal

Давайте поработаем с очень популярной математической константой — π, иначе Пи, которая имеет значение, равное 3.14159 (22/7 в дроби). Скопируйте и вставьте приведенный ниже запрос в новое окно запроса и выполните его.

DECLARE @PiWithNoDecimal DECIMAL (6,0) = 3,14159

DECLARE @ Piupto5Decimal DECIMAL (6,5) = 3,14159

DECLARE @ Piupto1Decimal ASithNoDECIMAL

,

DECLARE @ Piupto1Decimal ASIithDECIMAL (3,19) Piupto5Decimal, @ Piupto1Decimal AS Piupto1Decimal

Приведенный выше набор результатов показывает, как SQL Server обрабатывает каждую комбинацию точности и масштаба как отдельный тип данных.Как и здесь, decimal (6, 0) ведет себя иначе, чем типы данных decimal (6,5) и decimal (3,1), и считаются тремя разными типами. Таким образом, мы можем настроить параметры в типе SQL Decimal для достижения желаемых результатов.

Теперь, когда мы знаем, как создать этот тип данных Decimal в SQL Server, давайте рассмотрим его на многочисленных примерах.

Использование десятичных чисел SQL в таблицах

Давайте быстро создадим новую таблицу с именем «Пациенты», в которой используется десятичный тип данных для высоты и веса столбцов.Мы вставим несколько строк, используя предложение INSERT, как показано ниже, в демонстрационных целях.

СОЗДАТЬ ТАБЛИЦУ dbo.Patients

(Имя varchar (10),

Пол varchar (2),

Десятичное число высоты (3,2),

Десятичное число веса (5,2)

)

INSERT INTO ЗНАЧЕНИЯ ПАЦИЕНТА (‘John’, ‘M’, 6.1,80.4)

ВСТАВИТЬ ЗНАЧЕНИЯ ПАЦИЕНТОВ (‘Bred’, ‘M’, 5.8,73.7)

ВСТАВИТЬ ЗНАЧЕНИЯ ПАЦИЕНТОВ (‘Leslie’, ‘F’, 5 .3,66.9)

ВСТАВИТЬ ЗНАЧЕНИЯ ПАЦИЕНТОВ (‘Rebecca’, ‘F’, 5.7,50.2)

ВСТАВИТЬ ЗНАЧЕНИЯ ПАЦИЕНТОВ (‘Shermas’, ‘M’, 6.5,190.6)

После того, как данные будут заполнены в таблице, мы можем запросить эти данные с помощью оператора SELECT, как показано ниже. Десятичные значения можно увидеть в атрибутах роста и веса.

ВЫБРАТЬ * ИЗ dbo.PATIENTS

Давайте разберемся, что произойдет, если мы попытаемся вставить значения, превышающие указанную точность или значения шкалы при определении столбцов Высота и Вес.Для этой демонстрации мы вставим еще 2 строки в эту таблицу (как показано ниже).

  1. ВСТАВИТЬ ЗНАЧЕНИЯ ПАЦИЕНТОВ («Наибольшие», «M», «10,9», 88,5)

  2. ВСТАВИТЬ ЗНАЧЕНИЯ ПАЦИЕНТОВ («Халк», «M», «9,9», 1000,45)

Он обнаруживает ошибку ниже, сообщающую об ошибке арифметического переполнения, и SQL Server завершил выполнение операторов.

Давайте рассмотрим корень проблемы:

  • Высота в десятичной системе счисления (3, 2) означает, что значение может состоять из трех цифр в целом и двух цифр справа от десятичной точки. В первой строке кода выше значение 10.9 (рассматриваемое как 10.90 = 4 цифры в целом) превышает указанный диапазон (3, 2) и вызывает переполнение.
  • Десятичный вес (5,2) означает, что общее количество цифр не может превышать 5, и 2 цифры могут быть помещены справа от десятичной дроби.Однако значение 1000,45 во второй строке кода выше превышает указанный диапазон (5, 2), поскольку оно означает всего 6 цифр и вызывает ошибку переполнения.
  • Краткое примечание — Если вы заметили, что в приведенном выше сообщении об ошибке вместо десятичного типа данных указан «числовой тип данных», причина в том, что десятичный и числовой типы данных абсолютно одинаковы, оба являются типы данных с фиксированной точностью и могут использоваться взаимозаменяемо

Устранение ошибки

Один из самых простых способов решения этой проблемы — повысить уровень точности столбцов для хранения больших чисел.Мы можем изменить тип данных столбцов, не удаляя таблицу или столбец с помощью приведенного ниже кода.

ALTER TABLE dbo.Patients ALTER COLUMN Высота десятичной дроби (4,2)

ALTER TABLE dbo.Patients ALTER COLUMN Вес в десятичной системе (6,2)

После изменения выполните запросы Insert, чтобы вставить эти строки в таблицу.

Мы видим, что строки добавляются в таблицу.

Рекомендации по хранению с десятичным типом данных в SQL Server

Тип данных SQL Decimal требует следующих байтов хранилища для указанной точности, как указано ниже Microsoft:

Прецизионный

Память (байты)

1–9

5

10–19

9

20–28

13

29 — 38

17

Использование пространства для типа данных SQL Decimal основано на определении столбца, а не на размере присвоенного ему значения.Например, Десятичное (12, 4) со значением 888.888 занимает 9 байтов на диске, а десятичное (22, 2) значение 9999,99 занимает 13 байтов на диске. Вот почему этот тип данных относится к столбцам фиксированной длины.

Как разработчик SQL, я всегда стараюсь использовать тип данных SQL Decimal как десятичный (9, 2), который потребляет меньше всего памяти, 5 байтов на диске и обеспечивает лучшую производительность.

Заключение

Я надеюсь, что эта статья предлагает понятный подход к использованию типа данных SQL Decimal.Всегда проверяйте, чтобы точность указанной десятичной или числовой переменной была достаточной для размещения присвоенных ей значений. Кроме того, мы наблюдали, как выбор правильного типа данных помогает разработчикам SQL экономить дисковое пространство.

В случае каких-либо вопросов, пожалуйста, задавайте их в разделе комментариев ниже.

Чтобы продолжить знакомство с SQL Server и используемыми в нем типами данных, я бы рекомендовал перейти по ссылкам ниже.

Гаури является специалистом по SQL Server и имеет более 6 лет опыта работы с международными международными консалтинговыми и технологическими организациями.Она очень увлечена работой над такими темами SQL Server, как База данных SQL Azure, Службы отчетов SQL Server, R, Python, Power BI, ядро ​​базы данных и т. Д. Она имеет многолетний опыт работы с технической документацией и увлекается разработкой технологий.

Она имеет большой опыт в разработке решений для данных и аналитики, а также в обеспечении их стабильности, надежности и производительности. Она также сертифицирована по SQL Server и прошла такие сертификаты, как 70-463: Внедрение хранилищ данных с Microsoft SQL Server.

Посмотреть все сообщения от Gauri Mahajan

Последние сообщения от Gauri Mahajan (посмотреть все)

.

Десятичный тип данных — Dynamics NAV

  • 2 минуты на чтение

В этой статье

Этот простой тип данных обозначает десятичные числа в диапазоне от -999 999 999 999 999,99 до +999 999 999 999 999,99.

Пример

Ниже приведены примеры десятичных значений.

  546,88
3425.57
  

Пример

Следующее ниже не является десятичным, а скорее целочисленным типом данных.

  342
  

Пределы переменных типа десятичных данных

Тип данных Decimal сопоставляется с типом данных Decimal среды CLR Microsoft .NET Framework, который контролирует точность и ограничения для переменных.

В следующей таблице показаны пределы для переменных типа Decimal в Dynamics NAV.

Предел Значение
Максимальное значение формата.

Это максимальное значение, которое может быть:

— Форматировано в переменную ТЕКСТ функцией FORMAT.
— ввод из пользовательского интерфейса или XMLPorts.
— Назначается непосредственно в исходном коде.

+/- 999 999 999 999 999,99
Максимальное значение типа данных поля.

Это максимальное значение, которое может содержать переменная поля в записи, пока она не сохраняется.

+/- 999 999 999 999 999,99
Максимальное сохраняемое значение.

Это максимальное значение, которое может храниться в базе данных.

Может читать ранее сохраненные значения, но не может сохранять значения за пределами диапазона форматирования, поскольку переменным поля нельзя присвоить значения вне диапазона форматирования.
Максимальное расчетное значение.

Это максимальное значение, которое может быть вычислено операторами кода без присвоения переменной поля, сохранения в базе данных или форматирования текстовой переменной.

+/- 79,228,162,514,264,337,593,543,950,335

В этой таблице показано, что максимальное безопасное значение, которое будет работать во всех версиях Dynamics NAV, составляет +/- 999 999 999 999 999.99.

Можно присвоить переменной максимальное значение, которое может быть отформатировано, а затем умножить эту переменную на большое положительное число, тем самым создав большее значение. Однако мы не рекомендуем этого делать. Если вы это сделаете, вы получите ошибки, если попытаетесь отформатировать эту переменную в текстовую переменную или назначить переменную переменной поля в записи.

См. Также

Тип данных BigInteger
Тип данных Integer
Функция ABS (Decimal, Integer, BigInteger)
Функция POWER (Decimal, Integer, BigInteger)
Функция RANDOM (Integer)
Функция RANDOMIZE (Integer)
Функция ROUND (десятичная)

.

Числовые типы данных схемы XML


Десятичные типы данных используются для числовых значений.


Десятичный тип данных

Десятичный тип данных используется для указания числового значения.

Ниже приведен пример объявления десятичной дроби в схеме:

Элемент в вашем документе может выглядеть так:

Или может выглядеть так:

Или может выглядеть так:

Или может выглядеть так:

Или может выглядеть так:



Целочисленный тип данных

Целочисленный тип данных используется для указания числового значения без дробного компонента.

Ниже приведен пример объявления целого числа в схеме:

Элемент в вашем документе может выглядеть так:

Или может выглядеть так:

Или может выглядеть так:

Или может выглядеть так:


Числовые типы данных

Обратите внимание, что все указанные ниже типы данных являются производными от типа данных Decimal.
(кроме самого десятичного числа)!

Имя Описание
байт 8-битное целое число со знаком
десятичное Десятичное значение
внутренний 32-разрядное целое число со знаком
целое Целочисленное значение
длинный 64-битное целое число со знаком
отрицательное Целое число Целое число, содержащее только отрицательные значения (.., — 2, -1)
неотрицательное Целое число Целое число, содержащее только неотрицательные значения (0,1,2, ..)
Неположительное Целое число Целое число, содержащее только неположительные значения (.., — 2, -1,0)
положительное Целое число Целое число, содержащее только положительные значения (1,2, ..)
короткий 16-разрядное целое число со знаком
беззнаковый длинный 64-разрядное целое число без знака
без знака 32-разрядное целое число без знака
без знака Короткое 16-разрядное целое число без знака
беззнаковый байт 8-разрядное целое число без знака

Ограничения на числовые типы данных

Ограничения, которые можно использовать с числовыми типами данных:

  • перечисление
  • дробь Цифры
  • макс Эксклюзив
  • макс. Включительно
  • минЭксклюзивный
  • мин. Включительно
  • узор
  • Всего

  • цифр
  • белое пространство

.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *