2011-10-07 9 views
8

He tropezado con un problema con CInt y convertir un doble en un número entero.CInt no redondea el valor doble de forma consistente, ¿cómo puedo eliminar la parte fraccionaria?

La cuestión es la siguiente:

CInt(10.5) 'Result is 10 
CInt(10.51) 'Result it 11, but I expected 10... 

me acostumbré a C la conversión # estilo donde (int) 10.51 es 10.

Como se señaló en la pregunta sobre Integer.Parse vs CInt, el resultado es sólo redondeado de alguna manera .

Sin embargo, todo lo que necesito es obtener solo una parte entera y desechar la fracción. ¿Cómo puedo lograr ese tipo de conversión en VB.NET? Después de algunas investigaciones, veo que puedo usar la función Fix() para hacer el truco, pero ¿es la mejor opción?

+2

Peor: cint (10,5) = 10 pero cint (11,5) = 12. Si el número entero parte está incluso redondeo de 0,50000000 es hacia abajo, por extraño que se ha acabado! – Martin

Respuesta

8

Es posible utilizar Int o Fix funciones, pero volver tipo de valor de estas funciones es el doble de lo que tiene que convertirlo a entero si es option stricton.

no = Convert.ToInt32(Int(10.51)) 
+0

Me gusta de esta manera mejor que el primero. Muchas gracias, AVD! – nbulba

+2

Combinando las dos respuestas, creo 'CInt (Int (10.51)) 'debería funcionar;) –

1

Creo que se puede tratar CInt(Math.Floor(10.51)) esperanza esto ayuda

+4

Tenga en cuenta que para un número negativo, esto podría no dar el resultado esperado: 'Math.Floor (-10.51)' es '-11'. Si quieres '-10', puedes usar' Math.Truncate'. –

4

En primer lugar, el supuesto de que CInt es equivalente a (int) en C# es incorrecta.

En segundo lugar, el comportamiento de redondeo de CInt no se asigna al azar - que en realidad utiliza "banqueros redondeo":

partes fraccionarias. Cuando convierte un valor no integral en un tipo integral , las funciones de conversión de enteros (CByte, CInt, CLng, CSByte, CShort, CUInt, CULng y CUShort) eliminan la parte fraccionaria y redondeando el valor al entero más cercano.

Si la parte fraccionaria es exactamente 0.5, la conversión entera funciona redondeando al entero par más cercano. Por ejemplo, 0.5 redondea a 0, y 1.5 y 2.5 redondean a 2. Esto a veces se llama redondeo de banquero , y su propósito es compensar un sesgo que podría acumular al sumar muchos de esos números.

El mejor equivalente a usar (int) en C# es la función Fix en el VisualBasic espacio de nombres que se redondea hacia cero (el mismo que Math.Truncate).

Esto, sin embargo, devuelve un valor doble, por lo que debe realizar una conversión adicional para obtener su número entero usando CInt.

CInt(Fix(10.5)) '10 
CInt(Fix(10.51)) '10 
CInt(Fix(11.5)) '11 
CInt(Fix(-10.5)) '-10 
CInt(Fix(-10.51)) '-10 
CInt(Fix(-11.5)) '-11 
Cuestiones relacionadas