variable type number new float ejemplos constant c# floating-point

type - new float c#



C float bug? 0.1-0.1=1.490116E-08 (5)

La matemática de coma flotante siempre es aproximada, en cualquier idioma, porque así es como funcionan las CPU. Si le importa la precisión absoluta de sus respuestas, por ejemplo, porque está tratando con dinero, entonces no debe usar el punto flotante.

¡¿Que esta pasando?! La resta funciona bien hasta que llegue a 0.1 - 0.1. Estoy en visual c # 2008 usando la API nonoba.com.

Console.WriteLine("hit! " + Users[targetNum].character.health + " : " + player.character.profile.attackPower); Users[targetNum].character.health -= player.character.profile.attackPower; Console.WriteLine("health! " + Users[targetNum].character.health);

salida:

hit! 0.1 : 0.1 health! 1.490116E-08

Gracias a todos: podría usar el tipo decimal, ya que normalmente estoy agregando / restando buenos números "redondos". Por ahora solo voy con:

if (Users[targetNum].character.health <= 0.00001)

Por cierto, sabía que esto no iba a ser realmente un "error" en c # - pensé que sería por un error en mi código o por alguna falta de comprensión, que era.

Después de leer toda la lectura recomendada, concluiré que mi locura se debe al uso normal del tipo de Número de ActionScript, que tal vez tiene un punto flotante decimal en lugar de binario; de todos modos, nunca daría esta salida.


Si siempre está sumando y restando números "redondos agradables", es decir, décimas o centésimas, puede realizar un seguimiento de su golpe y de sus valores de vida en décimas de unidad. Una analogía es un programa financiero que realiza un seguimiento del dinero en centavos enteros, en lugar de dólares en puntos flotantes. Usar enteros evita todos los problemas de matemática de punto flotante.




Esto parece bastante normal para las matemáticas de coma flotante ... siempre debe verificar contra un pequeño delta para compensar las diferencias de redondeo imperceptibles. Dependiendo del escenario, decimal puede ser lo que quieras.

Básicamente, a menos que pueda estar seguro de que es exactamente el mismo 0.1 en ambos casos (es decir, no se les ha hecho nada), no es probable que obtenga cero; en general, obtendrás algo muy cercano a cero. Con decimal , generalmente obtendrá más de lo que espera intuitivamente.

Ver también las páginas de Jon Skeet aquí: