Десятичный тип данных — способ представления чисел, используемый многими языками программирования или библиотеками тип данных для представления конечных десятичных дробей, таких как 0,3 и −1,17, без округления, и для выполнения над ними арифметических операций. Примерами являются:
типы _DecimalN языка C; тип decimal.Decimal в Python; типы DECFLOAT, DECIMAL и NUMERIC в SQL.
Десятичный тип данных может быть реализован либо как десятичное число с плавающей запятой (_DecimalN языка C или decimal.Decimal в Python), либо как десятичное число с фиксированной запятой (DECIMAL и NUMERIC в SQL). В случае числа с фиксированной запятой фиксируется число дробных десятичных разрядов. В случае числа с плавающей запятой экспонента представляет собой степень десяти из заданного диапазона, на которую умножается мантисса числа с заданным числом значащих цифр.
Отличия десятичных типов данных от двоичных типов данных
Дробные числа поддерживаются большинством языков программирования как двоичные числа с плавающей запятой или числа с фиксированной запятой. Большинство десятичных дробей (или большинство дробей в целом) не могут быть точно представлены в виде дроби со знаменателем, являющимся степенью двойки. Например, десятичная дробь 0,3 может быть представлена, как число одинарной точности (0,300000011920928955078125), так и как число двойной точности (0,299999999999999988897769753748434595763683319091796875). Стандарты языков программирования требуют, что бы это значение было правильно округлённым значением литерала, т.е. ошибка не должна превышать половину младшего разряда, однако, эта неточность может вызывать множество проблем. Например, выражения 0.1 + 0.2 == 0.3 или 0.3f == 0.3 могут, вопреки интуиции, на многих системах оказаться ложным из-за неточности представления десятичных чисел.
При форматных преобразованиях двоичных чисел десятичная точность дробной части переменная (зависит от величины числа и старшей цифры), поэтому в традиционных фиксированных форматах, для гарантированного преобразования всех значащих разрядов числа, точность дробной части приходится завышать, к примеру, оператор printf("%.*g %.*g\n", FLT_DECIMAL_DIG, 0.3f, DBL_DECIMAL_DIG, 0.3) выдаст 0.300000012 0.29999999999999999. Некоторые новые языки программирования (Python 3.7, C++20) реализуют форматные преобразования двоичных чисел переменной длины, с минимально необходимой точностью, но это не всегда удобно.
Хотя все десятичные дроби являются дробями, и, следовательно, можно использовать рациональный тип данных для их точного представления, во многих ситуациях может быть удобнее рассматривать только конечные десятичные дроби (дроби, знаменатель которых является конечной степенью десяти). Например, дробные единицы валюты во всем мире в основном основаны на знаменателе, являющемся степенью десяти. Кроме того, большинство измерений в науке представлены в виде десятичных дробей, в отличие от дробей с любой другой системой знаменателей.
Стандартные форматы
Стандарт ISO/IEC 60559 определяет несколько типов данных десятичных чисел с плавающей запятой различной точности (введены в редакции ISO/IEC 60559:2011, так же известной как IEEE 754-2008):
Формат чисел с плавающей запятой Decimal32 Формат чисел с плавающей запятой Decimal64 Формат чисел с плавающей запятой Decimal128
Поддержка языков программирования
Стандарт языка C, начиная с редакции С23 (ISO/IEC 9899:2024), определяет три типа _Decimal32, _Decimal64 и _Decimal128, соотвествующие десятичным типам ISO/IEC 60559; GNU Compiler Collection (gcc) обеспечивает поддержку десятичных чисел с плавающей запятой в качестве расширений языков C++ и языка C предыдущих редакций; В C# есть встроенный тип данных decimal, который состоит из 128 бит, что дает 28–29 значащих цифр. Ее приблизительный диапазон составляет ±1,0. × 10 до ±7,9228 × 10; dc/bc реализуют арифметику десятичных чисел с фиксированной запятой ; В стандартную библиотеку Java входит java.math.BigDecimal ; В Objective-C API Cocoa и GNUstep предоставляют класс NSDecimalNumber и тип данных NSDecimal для представления десятичных чисел, мантисса которых имеет длину до 38 цифр, а показатель степени находится в диапазоне от −128 до 127; PL/I изначально поддерживал, как десятичные числа с фиксированной запятой, так и десятичные числа с плавающей запятой; Начиная с Python 2.4, стандартная библиотека Python включает в себя модуль decimal; Стандартная библиотека Ruby включает в модуль bigdecimal; SQL определяет тип DECFLOAT — десятичных чисел с плавающей запятой и типы DECIMAL и NUMERIC — десятичные числа с фиксированной запятой.
См. также
Десятичное число с плавающей запятой Арифметика произвольной точности Арифметика с плавающей запятой
Ссылки
Категория:Арифметика с плавающей запятой Категория:Компьютерная арифметика Категория:Типы данных