Welche C++-Variable kann Dezimalzahlen enthalten?
Das folgende gilt für alle Programmiersprachen die auf einem klassischen binären von Neumann Rechner laufen (also quasi so ziemlich alles was einem normalen Menschen im Alltag als Computer begegnet)
Ein Rechner arbeitet binär, deshalb kann eine Dezimalzahl mit endlich vielen Nachkommastellen als binäre Fließkommazahl (float, double und wie sie alle heißen) unendlich periodisch werden.
Warum?
Das liegt an der Primfaktorzerlegung der Basis. Die 10 kann man ja bekanntlich in 2 × 5 zerlegen.
Deshalb hat man mit 0,5 als binäre Fließkommazahl kein Problem (ist ja 1/2 oder 2⁻¹).
Bei 0,2 hat man allerdings ein Problem. Das ist nämlich ein fünftel.
Und da die 2 als Primfaktorzerlegung ja nur die 2 hat sind wir hier aufgeschmissen, weil 5 eben nicht ohne Rest durch 2ˣ teilbar ist (x ist eine beliebige Zahl > 0).
Deswegen ist 0.2 zur Bais 10
0,
0011
¯
¯
¯
¯
¯
¯
¯
¯
¯
¯
also ein unendlich periodischer Binärbruch.
Deswegen gibt es keine native Möglichkeit Dezimalzahlen auf einem Binärrechner sauber zu erfassen.
Per se muss man eine Dezimalzahl also immer als Ganzzahl zusammen mit der Anzahl der Nachkommastellen abbilden (c# Decimal sowie Java BigDecimal machen das so).
Leider gibt es - soweit ich weiß - noch keine Standardimplementierung.
GCC hat das hier
Decimal Float (Using the GNU Compiler Collection (GCC))
6.14 Decimal Floating Types ¶ As an extension, GNU C supports decimal floating types as defined in the N1312 draft of ISO/IEC WDTR24732. Support for decimal floating types in GCC will evolve as the draft technical report changes. Calling conventions for any target might also change. Not all targets support decimal floating types. The decimal floating types are _Decimal32 , _Decimal64 , and _Decimal128 . They use a radix of ten, unlike the floating types float , double , and long double whose radix is not specified by the C standard but is usually two. Support for decimal floating types includes the arithmetic operators add, subtract, multiply, divide; unary arithmetic operators; relational operators; equality operators; and conversions to and from integer and other floating types. Use a suffix ‘ df ’ or ‘ DF ’ in a literal constant of type _Decimal32 , ‘ dd ’ or ‘ DD ’ for _Decimal64 , and ‘ dl ’ or ‘ DL ’ for _Decimal128 . GCC support of decimal float as specified by the draft technical report is incomplete: When the value of a decimal floating type cannot be represented in the integer type to which it is being converted, the result is undefined rather than the result value specified by the draft technical report. GCC does not provide the C library functionality associated with math.h , fenv.h , stdio.h , stdlib.h , and wchar.h , which must come from a separate C library implementation. Because of this the GNU C compiler does not define macro __STDC_DEC_FP__ to indicate that the implementation conforms to the technical report. Types _Decimal32 , _Decimal64 , and _Decimal128 are supported by the DWARF debug information format.
https://gcc.gnu.org/onlinedocs/gcc/Decimal-Float.html
Und Visual C++ das:
DECIMAL - Win32 apps
The DECIMAL structure represents a decimal data type that provides a sign and scale for a number.
https://learn.microsoft.com/en-us/windows/win32/api/wtypes/ns-wtypes-decimal-r1