Solución:
Me gustan las respuestas actuales. Quiero agregar esto como prueba de por qué NUMERIC
es necesario:
SELECT
4.35 * 100 a_float
, CAST(4.35 AS NUMERIC) * 100 a_numeric
Esto no es un error, así es exactamente como IEEE define los flotadores que deben manejarse. mientras tanto NUMERIC
exhibe un comportamiento más cercano a lo que los humanos esperan.
Para otra prueba de NUMERIC
utilidad, esta respuesta muestra cómo NUMERIC
puede manejar números demasiado grandes para que JavaScript los maneje normalmente.
Antes de culpar a BigQuery por este problema, puede verificar que la mayoría de los otros lenguajes de programación harán lo mismo. Python, por ejemplo:
Hay bastantes diferencias:
-
Abarcar:
FLOAT
puede ser tan grande como ± 2 ^ 1023 (aunque no puede representar todos los enteros en este rango) -
Precisión cercana a cero: cercana a cero,
FLOAT
puede ser tan preciso como 2 ^ -1022. -
NaN / Inf:
FLOAT
tiene “no un número” y valores “infinitos” positivos y negativos, mientras queNUMERIC
no. -
Tamaño de almacenamiento: cada uno
NUMERIC
requiere 16 bytes de almacenamiento, peroFLOAT
solo requiere 8 bytes. -
Naturaleza impredecible: como insinúa Ajay, el gran inconveniente de
FLOAT
es que los números que puede representar con precisión no se alinean tan de cerca con los números que normalmente nos interesan. Como resultado, el punto flotante debe usarse para cantidades físicas donde algún error es aceptable. Si necesita resultados predecibles, exactos y predecibles para humanos, como en cálculos financieros, utiliceNUMERIC
La principal diferencia es que los flotantes / dobles son tipos de punto flotante binario y un numérico almacenará el valor como un tipo de punto decimal flotante. Por lo tanto, Numeric tiene una precisión mucho mayor y generalmente se usa en aplicaciones monetarias (financieras) que requieren un alto grado de precisión. Pero en cuanto al rendimiento, Numeric es más lento que los tipos double y float. Numeric puede representar con 100% de precisión cualquier número dentro de la precisión del formato decimal, mientras que Float y Double, no pueden representar con precisión todos los números, incluso los números que están dentro de la precisión de sus respectivos formatos.