es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

C# Math.Floor redondea hacia abajo un número decimal sin decimales. A veces.

Estoy usando Math.Floor para redondear un double hacia abajo sin decimales.
Esto funciona como se esperaba, excepto en algunos casos.
A veces, cuando el double no tiene decimales, Math.Floor reduce el double en 1. Así que, por ejemplo, 2006 se convierte en 2005. Esto no siempre ocurre, la mayoría de las veces no cambia el valor del double. 2005 sigue siendo 2005.

Fragmento de código:

double dBuislengte = 0;
dBuislengte = swDispDim.GetDimension2(0).Value;
Debug.Print(“d: ” + dBuislengte);
dBuislengte = Math.Floor(dBuislengte);
Debug.Print(“d Math.Floor: ” + dBuislengte);

Salida:

d: 436
d Math.Floor: 436
d: 1854,5
d Math.Floor: 1854
d: 1951,5
d Math.Floor: 1951
d: 2006
d Math.Floor: 2005

Como puedes ver, el primer valor de salida es lo que espero que suceda y lo que ocurre la mayoría de las veces. El último valor muestra el problema.

Puedo solucionarlo simplemente realizando la operación de Math.Floor en doubles con decimales, pero eso no me ayuda a entender qué está sucediendo.
¿Alguien puede orientarme en la dirección correcta?

¡Gracias!

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el problema que estás experimentando está relacionado con la forma en que se representan los números de punto flotante en binario. Debido a la forma en que las computadoras almacenan estos números, puede haber cierta imprecisión en los valores que representan. Cuando llamas a Math.Floor en un valor double que está muy cerca de un número entero, la imprecisión en la representación de punto flotante puede hacer que el valor se redondee hacia abajo al número entero más cercano que sea menor que el valor original.

    Una posible solución a este problema es usar Math.Round en lugar de Math.Floor, con los parámetros adecuados para indicar que deseas redondear hacia abajo al número entero más cercano. Otra opción sería verificar si el valor está muy cerca de un número entero antes de llamar a Math.Floor y manejar esos casos por separado.

    En general, la lección importante aquí es que al trabajar con números de punto flotante, es importante ser consciente de que puede haber cierta imprecisión en los valores y tomar medidas para manejar esto según sea necesario en tu código.

Comments are closed.