2012-05-24 8 views
7

Risoluzione di un errore Sono venuto a qualche scoperta interessante.C# Errore nell'operatore di modulo%

Il risultato di questa procedura

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(); 
    } 

è

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 - corretta

double 4.0 % 1 = 0 - corretta

Ma bug è in:

01.235.

Math.pow (64, 1.0/3.0)% 1 = 1

radice cubica da 64 è 4. Perché in quel caso 4 % 1 = 1?

+0

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

+0

Se si vuole fare in modo che è un numero intero per cui stai ricevendo il modulo, prova a lanciarlo. – SQLMason

+0

Siete alla ricerca di questo penso http://stackoverflow.com/questions/618535/what-is-the-difference-between-decimal-float-and-double-in-c – Nevyn

risposta

12

Math.Pow(64, 1.0/3.0) restituisce 3.9999999999999996.
Questo viene arrotondato a 4 quando visualizzato.

Il passaggio modulo 1 restituisce 0.99999999999999956, che viene similmente arrotondato a 1 quando visualizzato.

È possibile vedere i veri valori aggiungendo .ToString("R")

+0

Quindi il resto restituito dall'operatore modulo non dovrebbe essere qualcosa come .99999999 o .0000001 a seconda del valore esatto di 'Math.Pow (64 ... ecc.)', Invece del valore 1? –

+0

Grazie, Math.Pow (64, 1.0/3.0) restituisce 3.9999999999999996. - Questo spiega tutto – SelvirK

3

dCubeRootOf64 % 1 = 1 restituisce 1 anziché 0; causare Math.Pow(i64, 1.0/3.0) rendimenti 3.9999999999999996 e 3.9999999999999996 % 1 rendimenti 0.99999999999999956 che a sua volta sempre arrotondato a 1.

Così il risultato 1.

+1

Deve esserci una certa sciocchezza con il doppio che sta succedendo qui. Non dovrebbe restituire 1. 1 va in 64 esattamente 64 volte, quindi il risultato dovrebbe essere 0. –

+0

@GrantWinney: Esatto. '4.0% 1' restituisce' 0'. – SLaks

+0

Ho appena provato lo stesso codice postato e ha assegnato 1 come o/p in 3.5 framework. – Rahul

Problemi correlati