2011-06-10 40 views
23

Cuando hago una división en C#, automáticamente se redondea hacia abajo. Vea este ejemplo:C# está redondeando las divisiones por sí mismo

double i; 
i = 200/3; 
Messagebox.Show(i.ToString()); 

Esto me muestra un cuadro de mensaje que contiene "66". 200/3 es en realidad 66.66666 ~ sin embargo.

¿Hay alguna manera de evitar este redondeo y mantener un número como 66.6666667?

+9

La lección importante aquí no es solo que la aritmética entera se hace en enteros. Más bien, es que los tipos de * operandos * son más relevantes para el análisis del programa que el tipo al que se le asigna el resultado. En C# casi siempre razonamos desde "adentro" a "afuera"; no decimos "oh, veo que estás asignando esto a un doble, entonces haré una aritmética de coma flotante". En cambio, decimos "Veo que estás dividiendo dos enteros, debes querer el resultado como un entero. Oh, quieres ese entero como un doble, luego lo convertiremos en un doble". –

+0

Estoy viendo este "problema" actualmente también. Puedo ver desde abajo que las razones de por qué dividir dos enteros da como resultado un número entero, y estoy contento con eso. Sin embargo, lo que no puedo entender es lo siguiente: ¿Por qué C#/VB.Net redondea 200/3 en 66? Sabemos que si hacemos lo siguiente "200/3.0" terminamos con 66.6666667. Entonces, ¿por qué se redondea a 66 y no se redondea a 67? Si hago lo siguiente, termino con 67: Convert.ToInt32 (200/3,0) Así que mi decimal a int se convierte en 67, sin embargo, el tiempo de ejecución convertirá mi número a 66? – Oxonhammer

Respuesta

37

i = 200/3 está realizando la división de enteros.

Trate ya sea:

i = (double)200/3

o

i = 200.0/3

o

i = 200d/3

Declarar una de las constantes como un do uble hará que se use el operador de doble división.

6

200/3 es una división entera, lo que da como resultado un número entero.

tratan 200,0/3,0

+0

O 200/3.0. O 200.0/3. O (doble) 200/3. o 200/(doble) 3. O como quiera hacerlo. – JAB

+0

@JAB no hay tiempo para pensar, solo tenía que llegar primero :) –

+0

ah man! ¡tanto por ser el primero! –

3

200/3 esta es una división entera. Cambie a: 200.0/3 para convertirlo en una división de coma flotante.

0

200 y 3 son enteros, por lo que el resultado será un número entero. Convierte uno de ellos a un decimal.

1

Prueba este

i = 200d/3d; 

y no va ronda.

2

doble i = 200.0/3;

doble i = ((doble) 200)/3;

Lo que sucede es que los dos enteros realizan una división de enteros, y luego la respuesta entera se asigna al flotante. Para evitar eso, siempre lanza uno de los números como un doble.

3

Aunque la respuesta es en realidad 66.666, lo que está sucediendo es que 200/3 se está calculando, lo que da como resultado un número entero. El número entero se coloca en el flotador. Las matemáticas en sí están sucediendo como matemáticas enteras. Para que sea un flotador, use 200.0/3. El .0 causará que trate 200 como un flotante, lo que resulta en matemática de punto flotante.

5

Puede especificar cadena de formato con el número deseado de ponits decimales:

double i; 
i = 200/3.0; 
Messagebox.Show(i.ToString("F6")); 
-1

Todas las respuestas dadas son equivocadas porque traducen la división entera en una de tipo doble, que limpiamente no es lo que se pidió (al menos desde el punto de vista del rendimiento). La respuesta obvia es la matemática de la escuela primaria, multiplicar por 10, sumar 5 y dividir nuevamente, todo entero.

i = (2000/3 + 5)/10

Usted está cogiendo una segunda división aquí, que es mejor que no hacer dobles conversiones, pero todavía está lejos de ser perfecto. Puede ir aún más allá y multiplicar por otro factor y agregar otros valores que no sean cinco, lo que le permite usar el desplazamiento a la derecha en lugar de dividir entre 10. La fórmula exacta para hacer esto se deja como un ejercicio para el lector. (Solo google "divisiones con Multiply Shift")

Que tengas un buen día.

+0

No. Está claro en el código de muestra del OP que quiere un resultado 'doble' sin el truncamiento a' int'. –

Cuestiones relacionadas