En primer lugar, usted puede multiplicar flota. El problema que tienes no es la multiplicación en sí, sino el número original que has usado. La multiplicación puede perder algo de precisión, pero aquí el número original que has multiplicado comenzó con la precisión perdida.
Esto es en realidad un comportamiento esperado. float
s se implementan usando representación binaria lo que significa que no pueden representar valores decimales con precisión.
Consulte MSDN para obtener más información.
También puede ver en the description of float que tiene una precisión de 6-7 dígitos significativos. En su ejemplo, si redondea 31.099998
a 7 dígitos significativos obtendrá 31.1
por lo que sigue funcionando como se espera aquí.
double
tipo, por supuesto, sería más preciso, pero aún tiene un error de redondeo debido a su representación binaria, mientras que el número que escribió es decimal.
Si desea una precisión completa para los números decimales, debe usar un tipo de decimal. Este tipo existe en idiomas como C#. http://msdn.microsoft.com/en-us/library/system.decimal.aspx
También puede usar la representación de números racionales. Usando dos enteros que le darán una precisión completa, siempre y cuando pueda representar el número como una división de dos enteros.
La respuesta corta es que la mantisa se almacena como un valor binario, no como un valor decimal. Entonces, los únicos números representados exactamente son aquellos que pueden descomponerse en poderes de dos (es decir, 1/2, 1/4, 1/8, etc.) Para la historia completa, intente http://docs.sun.com /source/806-3568/ncg_goldberg.html –
Duplicado de MUCHAS preguntas. Vea la etiqueta "precisión flotante". – dan04
posible duplicado de [Manejo de problemas de precisión en números de coma flotante] (http://stackoverflow.com/questions/590822/decision-with-accuracy-problems-in-floating-point-numbers). [¿Las matemáticas de JavaScript están rotas?] (Http://stackoverflow.com/questions/588004/is-javascripts-math-broken) es bueno también –