{{Short description|Data type for storing floating-point numbers in base-10}} Some programming languages (or compilers for them) provide a built-in (primitive) or library '''decimal data type''' to represent non-repeating decimal fractions like 0.3 and −1.17 without rounding, and to do arithmetic on them. Examples are the <code>decimal.Decimal</code> or <code>num7.Num</code> type of Python, and analogous types provided by other languages.
== Rationale == Fractional numbers are supported on most programming languages as floating-point numbers or fixed-point numbers. However, such representations typically restrict the denominator to a power of two. Most decimal fractions (or most fractions in general) cannot be represented exactly as a fraction with a denominator that is a power of two. For example, the simple decimal fraction 0.3 ({{sfrac|3|10}}) might be represented as {{sfrac|5404319552844595|18014398509481984}} (0.299999999999999988897769…). This inexactness causes many problems that are familiar to experienced programmers. For example, the expression <code>0.1 * 7 == 0.7</code> might counterintuitively evaluate to false in some systems, due to the inexactness of the representation of decimals.
Although all decimal fractions are fractions, and thus it is possible to use a rational data type to represent it exactly, it may be more convenient in many situations to consider only non-repeating decimal fractions (fractions whose denominator is a power of ten). For example, fractional units of currency worldwide are mostly based on a denominator that is a power of ten. Also, most fractional measurements in science are reported as decimal fractions, as opposed to fractions with any other system of denominators.
A decimal data type could be implemented as either a floating-point number or as a fixed-point number. In the fixed-point case, the denominator would be set to a fixed power of ten. In the floating-point case, a variable exponent would represent the power of ten to which the mantissa of the number is multiplied.
Languages that support a rational data type usually allow the construction of such a value from two integers, instead of a base-2 floating-point number, due to the loss of exactness the latter would cause. Usually the basic arithmetic operations ({{Char|+}}, {{Char|−}}, {{Char|×}}, {{Char|÷}}, integer powers) and comparisons ({{Char|1==}}, {{Char|<}}, {{Char|>}}, {{Char|≤}}, {{Char|≥}}, {{Char|≠}}) would be extended to act on them—either natively or through operator overloading facilities provided by the language. These operations may be translated by the compiler into a sequence of integer machine instructions, or into library calls. Support may also extend to other operations, such as formatting, rounding to an integer or floating point value, etc.
== Standard formats == IEEE 754 specifies three standard floating-point decimal data types of different precision, introduced in the 2008 revision of the standard (also adopted as ISO/IEC/IEEE 60559:2011): * Decimal32 floating-point format * Decimal64 floating-point format * Decimal128 floating-point format
== Language support == * C# has a built-in data type {{mono|decimal}} consisting of 128 bits resulting in 28–29 significant digits. It has an approximate range of ±1.0 × 10{{Super|−28}} to ±7.9228 × 10{{Super|28}}.<ref>{{cite web | url=http://msdn.microsoft.com/en-us/library/364x0z75.aspx | title=Floating-point numeric types - C# reference | date=29 September 2022 }}</ref> * Starting with Python 2.4, Python's standard library includes a {{mono|Decimal}} class in the module {{mono|decimal}}.<ref>{{Cite web|url=https://docs.python.org/library/decimal.html|title = Decimal — Decimal fixed point and floating point arithmetic — Python 3.10.0 documentation}}</ref> * Ruby's standard library includes a {{mono|BigDecimal}} class in the module {{mono|bigdecimal}}. * Java's standard library includes a [http://docs.oracle.com/javase/6/docs/api/java/math/BigDecimal.html <code>java.math.BigDecimal</code>] class. * In Objective-C, the Cocoa and GNUstep APIs provide an [https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSDecimalNumber_Class/Reference/Reference.html <code>NSDecimalNumber</code>] class and an [https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSDecimalNumber_Class/Reference/Reference.html <code>NSDecimal</code>] C data type for representing decimals whose mantissa is up to 38 digits long, and exponent is from −128 to 127. * Some IBM systems and SQL systems support DECFLOAT format with at least the two larger formats.<ref>{{Cite web|url=http://www.ibm.com/developerworks/data/library/techarticle/dm-0801chainani/|title=Data management|website=IBM }}</ref> * ABAP's new DECFLOAT data type includes decimal64 (as DECFLOAT16) and decimal128 (as DECFLOAT34) formats.<ref>{{Cite web |url=http://sapignite.com/decfloat-in-abap/ |title=How the new ABAP Data Type DECFLOAT helps computing complex calculation? « SAP Ignite |access-date=2012-07-28 |archive-url=https://web.archive.org/web/20120809062259/http://sapignite.com/decfloat-in-abap/ |archive-date=2012-08-09 }}</ref> * PL/I natively supports both fixed-point and floating-point decimal data. * GNU Compiler Collection (gcc) provides support for decimal floats as an extension to C and C++.<ref>{{cite web |title=GCC Manual |at=6.13 Decimal Floating Types |url=https://gcc.gnu.org/onlinedocs/gcc/Decimal-Float.html#Decimal-Float }}</ref>
==See also== * Arbitrary-precision arithmetic * Floating-point arithmetic * Floating-point error mitigation
== References == <references/>
{{Data types}}
Category:Data types Category:Computer arithmetic