Мови програмування (або компілятори для них) частіше за все надають вбудований (примітивний) або бібліотечний десятковий тип даних для представлення неповторюваних десяткових дробів, таких як 0.3 або -1.17, без округлення, і для виконання арифметики з ними. Прикладом є тип decimal.Decimal мови Python і аналогічні типи інших мов програмування .
Обґрунтування
Дробові числа підтримуються більшістю мов програмування як числа з плаваючою або фіксованою комою. Однак такі представлення зазвичай обмежують знаменник ступенем двійки. Більшість десяткових дробів (або більшість дробів загалом) не можна точно представити як дріб зі знаменником, який є ступенем двійки.
Наприклад, простий десятковий дріб 0.3 (3/10) може бути представлений як 5404319552844595/18014398509481984 (0,299999999999999988897769. . . ). Ця неточність викликає багато проблем, знайомих досвідченим програмістам. Наприклад, вираз 0.1 * 7 == 0.7 може суперечливо мати значення false у деяких системах через неточність подання десяткових знаків.
Хоча всі десяткові дроби є дробами, і, відтак, можна використовувати раціональний тип даних для їх точного представлення, у багатьох випадках може бути зручніше розглядати лише неперіодичні десяткові дроби (дроби, знаменник яких є ступенем десяти). Наприклад, дробові одиниці валюти в усьому світі здебільшого базуються на знаменнику, який є ступенем числа десять. Також більшість дробових вимірювань у науці повідомляється як десяткові дроби, на відміну від дробів з будь-якою іншою системою знаменників.
Десятковий тип даних може бути реалізований одним способом:
число з рухомою комою (змінний показник степеня представлятиме собою ступінь десяти, на який множиться мантиса числа)
число з фіксованою комою (знаменник буде встановлений у фіксованому ступені десяти)
Мови програмування, які підтримують раціональний тип даних, зазвичай дозволяють конструювати таке значення з двох цілих чисел, замість числа з плаваючою комою з основою 2, через втрату точності, яку б останнє спричинило. Зазвичай базові арифметичні операції ('+', ' − ', '×', '/', зведення цілих в ступінь ) і порівняння ('=', ' < ', ' > ', '≤') розширюються, щоб діяти на їх — або нативно, або через засоби перевантаження оператора, надані мовою програмування. Ці операції можуть бути переведені компілятором у послідовність цілочисельних машинних інструкцій або у виклики бібліотеки .
Стандартні формати
IEEE 754 визначає три стандартні типи десяткових даних із плаваючою комою різної точності:
Формат числа з плаваючою комою Decimal32
Формат числа з плаваючою комою Decimal64
Формат числа з плаваючою комою Decimal128
Підтримка мовами програмування
C# має вбудований тип даних "decimal", що складається з 128-біт, що призводить до 28-29 значущих цифр. Він має приблизний діапазон (-7.9 x 10^28 до 7.9 x 10^28) / (10^(0 .. 28)). [1]
Починаючи з Python 2.4, стандартна бібліотека Python включає клас Decimal в модулі decimal . [2]
Стандартна бібліотека Ruby включає клас BigDecimal в модулі bigdecimal .
У мові Objective-C API Cocoa та API GNUstep надають клас NSDecimalNumber і тип даних NSDecimal для представлення десяткових дробів, мантиса яких має довжину до 38 цифр, а експонента становить від -128 до 127.
Деякі системи IBM і системи SQL підтримують формат DECFLOAT принаймні з двома більшими форматами. [3]
У ABAP новий тип даних DECFLOAT включає формати decimal64 (як DECFLOAT16) і decimal128 (як DECFLOAT34). [4]
PL/I оригінально підтримує десяткові дані як з фіксованою, так і з плаваючою комою.