2012-05-24 15 views
7

Resolviendo un error Llegué a algunos descubrimientos interesantes.Error de C# en Operador de módulo%

El resultado de este procedimiento

static void Main(string[] args) 
    { 
     int i4 = 4; 
     Console.WriteLine("int i4 = 4;"); 
     Console.WriteLine("i4 % 1 = {0}", i4 % 1); 

     double d4 = 4.0; 
     Console.WriteLine("double d4 = 4.0;"); 
     Console.WriteLine("d4 % 1 = {0}", d4 % 1); 
     Console.WriteLine("-----------------------------------------------------------"); 
     int i64 = 64; 
     double dCubeRootOf64 = Math.Pow(i64, 1.0/3.0); 
     Console.WriteLine("int i64 = 64;"); 
     Console.WriteLine("double dCubeRootOf64 = Math.Pow(i64, 1.0/3.0) = {0}", dCubeRootOf64); 
     Console.WriteLine("dCubeRootOf64 = {0}", dCubeRootOf64); 
     Console.WriteLine("dCubeRootOf64 % 1 = {0} ?????????????? Why 1. ??????????", dCubeRootOf64 % 1); 

     Console.ReadLine(); 
    } 

es

int i4 = 4; 
i4 % 1 = 0 
double d4 = 4.0; 
d4 % 1 = 0 
----------------------------------------------------------- 
int i64 = 64; 
double dCubeRootOf64 = Math.Pow(i64, 1.0/3.0) = 4 
dCubeRootOf64 = 4 
dCubeRootOf64 % 1 = 1 ?????????????? Why 1. ?????????? 

int 4 % 1 = 0 - correcta

double 4.0 % 1 = 0 - correcta

Pero fallo está en:

Math.pow (64, 1,0/3,0)% 1 = 1

raíz Cubo de 64 es 4. ¿Por qué es en ese caso 4 % 1 = 1?

+0

Salida: Google (64^(1/3)) mod 1 – SQLMason

+0

Si desea asegurarse que es un número entero para el que está obteniendo el módulo, intente lanzarlo. – SQLMason

+0

Usted está buscando esto creo http://stackoverflow.com/questions/618535/what-is-the-difference-between-decimal-float-and-double-in-c – Nevyn

Respuesta

12

Math.Pow(64, 1.0/3.0) devuelve 3.9999999999999996.
Esto se redondea a 4 cuando se muestra.

Tomando el módulo 1 se devuelve 0.99999999999999956, que se redondea de manera similar a 1 cuando se muestra.

Se puede ver los verdaderos valores mediante la adición de .ToString("R")

+0

Entonces, ¿no devolvería el resto del operador de módulo algo como .99999999 o 0000001 dependiendo del valor exacto de 'Math.Pow (64 ... etc)', en lugar del valor 1? –

+0

Gracias, Math.Pow (64, 1.0/3.0) devuelve 3.9999999999999996. - Esto explica todo – SelvirK

3

dCubeRootOf64 % 1 = 1 devuelve 1 en lugar de 0; causar Math.Pow(i64, 1.0/3.0) vuelve 3.9999999999999996 y 3.9999999999999996 % 1 vuelve 0.99999999999999956 que a su vez conseguir redondeado a 1.

Así, el resultado 1.

+1

Debe haber algunos goofiness con dobles pasando aquí. No debería devolver 1. 1 pasa a 64 exactamente 64 veces, por lo que el resultado debería ser 0. –

+0

@GrantWinney: Exactamente. '4.0% 1' devuelve' 0'. – SLaks

+0

Acabo de probar el mismo código publicado y dado 1 como o/p en 3.5 framework. – Rahul