Los tres guardan números con una cantidad fija de dígitos, pero float y double son binarios (IEEE 754) mientras que los tipos decimales trabajan en base 10. Inspeccione cualquier valor con Conversor de Flotantes IEEE 754; la teoría está en Cómo funcionan los números de coma flotante y Número de coma flotante.
Los tipos lado a lado
| float (binary32) | double (binary64) | decimal (p. ej., decimal128) | |
|---|---|---|---|
| Bits totales | 32 | 64 | 128 |
| Disposición | 1 de signo, 8 de exponente, 23 de fracción | 1 de signo, 11 de exponente, 52 de fracción | Signo, exponente, hasta 34 dígitos decimales |
| Precisión | Unos 7 dígitos decimales | Unos 15-16 dígitos decimales | 34 dígitos decimales |
| Mayor valor finito | 3,4028235 × 10^38 | 1,7976931348623157 × 10^308 | 9,999… × 10^6144 |
| Épsilon de máquina | 1,19 × 10^-7 | 2,22 × 10^-16 | 10^-33 |
| Enteros exactos hasta | 16 777 216 (2^24) | 9 007 199 254 740 992 (2^53) | Todos los de hasta 34 dígitos |
| Representa 0,1 con exactitud | No | No | Sí |
La sorpresa clásica
- En doble precisión
0.1 + 0.2es0.30000000000000004, y elfloatmás cercano a 0,1 es0.10000000149011612. - Por encima de 2^24, un
floatno distingue enteros vecinos:16777216 + 1sigue siendo16777216. - En aritmética decimal
0.1 + 0.2es exactamente0.3(decimalde Python). - Compare los flotantes con una tolerancia, nunca con
==.
Cuál usar
- Gráficos, audio, aprendizaje automático y juegos: float, donde importan más la memoria y la velocidad que el último dígito.
- Ciencia, estadística y código numérico general: double.
- Dinero, facturas, impuestos y todo lo que la gente comprueba a mano: decimal (o céntimos enteros).
- Identificadores y contadores grandes: enteros, nunca coma flotante.