2010-11-02 13 views
6

He estado buscando en Internet tratando de entender en su forma simplista por qué ocurre este comportamiento.¿Por qué es en vb.net si asigno un número a una sola variable? No es igual al mismo valor

Dim mysingle As Single = 456.11 
Dim mybool As Boolean = mysingle = 456.11 

En las líneas de arriba mybool se convierte en falso. Encontré este comportamiento al poner el single en un doble. Encontré dígitos adicionales. La documentación de .net declara que un solo es un valor apropiado: S

I gatehr one es un número de coma flotante de 32 bits? Pero ¿por qué aparecen dígitos extra cuando he dicho explícitamente cuál es el número ... seguramente la memoria debería almacenar que los números a cada lado de mi número son 0 para llenar la ubicación de la memoria?

Mi cerebro se fríe en éste :(

Respuesta

10

el valor se compara en la segunda declaración no se considera un Single, sino que está siendo tratado como un Double. Dado que está utilizando VB.NET puede sufijo con un ! para forzarlo a un Single y thi s volverá True:

Dim mysingle As Single = 456.11 
Dim mybool As Boolean = mysingle = 456.11! 
+1

+1: Esto es completamente cierto: el problema es hacer comparaciones dobles/simples. Sin embargo, la razón por la cual este es un problema se debe a la precisión de coma flotante, entendiendo que hará que esta respuesta sea mucho más obvia. –

+0

@Reed gracias, definitivamente de acuerdo con usted en ese punto. –

+0

Es curioso que tanto vb.net como C# generalmente prohíben las asignaciones de "doble" a "único", pero permiten asignaciones en la dirección inversa así como comparaciones directas de igualdad, a pesar de que estas últimas están mucho más cargadas de peligros que las primeras. Coaccionar un doble a uno puede causar una pérdida de precisión, pero todas las operaciones numéricas pueden causar dicha pérdida, y la pérdida generalmente no será un problema, excepto cuando los números se convierten de nuevo (lo que en mi humilde opinión debería requerir un reparto). ¿Cuál sería el resultado más sorprendente: 'Dim x As Double = someInt/10.0f' or' Dim y As Single = someInt/10'? – supercat

1

Otra buena referencia para la comprensión de punto flotante en .NET: http://www.yoda.arachsys.com/csharp/floatingpoint.html

Permítanme destacar su punto de comparaciones:

Una consecuencia de todo esto es que muy rara vez debe ser comparando los números de punto flotante binario para la igualdad directamente. [...] Una forma sencilla de hacerlo es a resta uno del otro, utilizar Math.Abs ​​para encontrar el valor absoluto de la diferencia , y luego comprobar si este es menor que una cierta tolerancia nivel.

+0

gracias por recordarme el uso de Math.Abs. –

Cuestiones relacionadas