Para mostrar un número de punto flotante con dos decimales en Python, se puede utilizar el operador de formato %f junto con una precisión específica.
Formatear un número flotante con dos decimales
En el código de arriba, hemos añadido .1 entre % y f en el operador %f.
El usar %f en el ejemplo de arriba añadió dos ceros al número. Pero no hay nada muy especial sobre ello.
Como era de esperarse, el número de punto flotante (1.9876) fue redondeado hasta dos lugares decimales - 1.99.
Por lo que %.2f significa redondear a dos espacios decimales.
En este caso, el número 1.9876 se muestra como 1.99 porque el tercer decimal es 7 y provoca el redondeo del segundo decimal.
| Formato | Resultado | Descripción |
|---|---|---|
| %f | 1.987600 | Muestra el número con seis decimales por defecto. |
| %.2f | 1.99 | Redondea y muestra el número con dos decimales. |
| %d | 1 | Ignora los números decimales y muestra solo la parte entera. |
Ejemplo con el formateador %.2f
Los tipos numéricos de punto flotante representan números reales.
En el ejemplo de arriba, hemos creado un número de punto flotante:
numero_flotante = 1.9876
Puedes jugar con el código para ver que sucede mientras cambias el número en el operador de formato.
Al modificar el valor de numero_flotante y mantener el formato %.2f, el resultado continuará expresándose con dos posiciones después del separador decimal.
Cómo usar el formateador %d en Python
Otro método de formateo que podemos usar con números de punto flotante en Python es el formateador %d.
Cuando la variable numero_flotante es formateada usando %d, solo 1 fue retornado.
El formateador %d ignora los números decimales y solo retorna la parte entera.
Por tanto, %d no es apropiado cuando se necesita conservar o mostrar los decimales de un número flotante.
Precisión de los números de punto flotante
Los números de punto flotante tienen una precisión limitada.
PHP utiliza el formato de precisión decimal IEEE 754, que dará un error relativo máximo del orden de 1.11e-16 (debido a los redondeos).
una representación exacta como números de punto flotante en base 2, utilizada internamente, y esto independientemente del tamaño de la mantisa.
ser convertidos sin una pequeña pérdida de precisión.
números de punto flotante es problemática, debido a la forma en que se representan internamente.
La pérdida de precisión no depende simplemente de la cantidad de decimales que se muestra. Está relacionada con la forma en que el valor se representa internamente como un número binario de punto flotante en un registro finito.
Por ejemplo, aunque 0.8 termina en notación decimal, en binario se representa mediante una secuencia repetitiva que debe truncarse. 0.1 y 0.7 también son valores no terminantes en binario, por lo que igualmente pueden sufrir truncamiento.
Como consecuencia, la suma de valores truncados no siempre coincide exactamente con la representación truncada del resultado esperado.
PHP thinks that 1.6 (coming from a difference) is not equal to 1.6.
This happens probably because $x is not really 1.6, but 1.599999..
Para probar la igualdad de valores de números de punto flotante, se utiliza un límite superior del error relativo al redondeo.
representado por la constante NAN.
un valor indefinido o no representable en cálculos con números de punto flotante.
Redondeo y representación interna
El formato %.2f controla la representación visible del número, pero no transforma necesariamente el valor interno en un número exacto con dos decimales.
El redondeo puede producir resultados inesperados cuando se realizan varias operaciones antes de aplicar el formato.
Los números de punto flotante pueden ser convertidos sin una pequeña pérdida de precisión.
directamente.
el valor primero en int y luego en float.
Estas diferencias son especialmente importantes al comparar resultados, acumular valores o utilizar números flotantes como índices, identificadores o claves.
Uso de números flotantes para importes
General computing hint: If you're keeping track of money, do yourself and your users the favor of handling everything internally in cents and do as much math as you can in integers.
Store values in cents if at all possible.
Add and subtract in cents.
El tipo decimal es adecuado cuando el grado de precisión requerido viene determinado por el número de dígitos a la derecha del separador decimal.
Estos números se usan normalmente en aplicaciones financieras, para importes de moneda (por ejemplo, 1,00 USD), tasas de interés (por ejemplo, 2,625%), etc.
Los números pares que son precisos para un solo dígito decimal se controlan con mayor precisión por el decimal tipo: 0,1, por ejemplo, se pueden representar exactamente mediante una decimal instancia, mientras que no hay ninguna double instancia o float que represente exactamente 0,1.
Debido a esta diferencia en los tipos numéricos, los errores de redondeo inesperados pueden producirse en cálculos aritméticos cuando se usa double o float para los datos decimales.
Puede usar double en lugar de decimal cuando optimizar el rendimiento es más importante que garantizar la precisión.
Sin embargo, cualquier diferencia en el rendimiento pasa desapercibida por todas las aplicaciones que consumen más cálculos.
Otra posible razón para evitar decimal es minimizar los requisitos de almacenamiento.
Por ejemplo, ML.NET usa float porque la diferencia entre 4 bytes y 16 bytes se suma para conjuntos de datos muy grandes.
Tipos de punto flotante y conversiones
Todos los tipos numéricos de punto flotante son tipos de valor.
También son tipos simples y se pueden inicializar mediante literales.
La referencia del lenguaje C# documenta la versión publicada más recientemente del lenguaje C#.
En la tabla anterior, cada palabra clave de tipo de C# de la columna situada más a la izquierda es un alias para el tipo de .NET correspondiente.
Son intercambiables.
El valor predeterminado de cada tipo de punto flotante es cero, 0.
Cada uno de los tipos de punto flotante tiene las MinValue constantes y MaxValue que proporcionan el valor finito mínimo y máximo de ese tipo.
Los float tipos y double también proporcionan constantes que representan valores no numéricos e infinitos.
Puede mezclar tipos enteros y los float tipos y double en una expresión.
En este caso, los tipos enteros se convierten implícitamente en uno de los tipos de punto flotante y, si es necesario, el float tipo se convierte implícitamente en double.
También puede mezclar tipos enteros y el decimal tipo en una expresión.
No se puede mezclar el decimal tipo con los float tipos y double en una expresión.
Solo hay una conversión implícita entre tipos numéricos de punto flotante: de float a double.
Sin embargo, puede convertir cualquier tipo de punto flotante a cualquier otro tipo de punto flotante mediante la conversión explícita.
En el ejemplo anterior también se muestra el uso de _ como separador de dígitos.
Comparación de números flotantes
La comparación directa de números de punto flotante es problemática, debido a la forma en que se representan internamente.
Los valores que parecen iguales cuando se muestran con dos decimales pueden tener representaciones internas ligeramente diferentes.
Por eso, para probar la igualdad de valores de números de punto flotante, se utiliza un límite superior del error relativo al redondeo.
La comparación mediante una tolerancia permite considerar iguales dos valores cuya diferencia se encuentre dentro del margen de error aceptable.
Precauciones al convertir flotantes en texto
Be careful when using float values in strings that are used as code later, for example when generating JavaScript code or SQL statements.
The float is actually formatted according to the browser's locale setting, which means that "0.23" will result in "0,23".
This would result in a different result for users with some locales.
Esto puede generar problemas cuando el texto producido se interpreta como código o como una consulta.
Similar problems could arise anywhere else (SQL, any string used as code somewhere else).
JavaScript won't state an error, additional arguments are discarded without notice, but the function doBar(a) would get 0 as parameter.
which is obviously a different call to the function.
Al generar código o consultas, el separador decimal debe controlarse explícitamente para evitar que la configuración regional cambie el significado del valor.
Valores no numéricos e infinitos
Los tipos float y double también proporcionan constantes que representan valores no numéricos e infinitos.
Un valor no representable en cálculos con números de punto flotante puede estar representado por la constante NAN.
La constante NAN representa un valor indefinido o no representable en cálculos con números de punto flotante.
También pueden aparecer valores infinitos cuando una operación supera el intervalo finito disponible para el tipo numérico utilizado.
Rendimiento y almacenamiento
Puede usar double en lugar de decimal cuando optimizar el rendimiento es más importante que garantizar la precisión.
Otra posible razón para evitar decimal es minimizar los requisitos de almacenamiento.
Por ejemplo, ML.NET usa float porque la diferencia entre 4 bytes y 16 bytes se suma para conjuntos de datos muy grandes.
En aplicaciones con grandes cantidades de datos, una diferencia de almacenamiento por elemento puede aumentar considerablemente el tamaño total del conjunto de datos.
Formateo y control visual
El usar %f en el ejemplo de arriba añadió dos ceros al número.
El formateador %f muestra una cantidad fija de posiciones decimales, mientras que %d elimina la parte fraccionaria y conserva únicamente la parte entera.
Como era de esperarse, el número de punto flotante (1.9876) fue redondeado hasta dos lugares decimales - 1.99.
Por lo que %.2f significa redondear a dos espacios decimales.
Puedes jugar con el código para ver que sucede mientras cambias el número en el operador de formato.
