Ho un problema con una semplice moltiplicazione che non riesco a capire ... Sto lavorando con .Net Framework 4 e sto costruendo in x86. Sto eseguendo il seguente codice:Doppia moltiplicazione in C#
double x = 348333.673899683;
double y = 4521014.98461396;
double aux = x * y;
Il valore previsto per aux è 1574821759346,09949827752137468 (l'ho fatto con una semplice calcolatrice). Tuttavia, il valore che ottengo in aux è . Vedi che è non un errore di precisione, anche la parte numero intero è stata cambiata.
Se inserisco un punto di interruzione nella moltiplicazione e passa il mouse sopra l'operatore de *, vedo x * y = 1574821759346,0994 che è ok. Se mi passa il mouse sopra la variabile aux vedo aux = 1574821822464
Al fine di chiarire l'ultimo paragrafo, due immagini può essere visto sotto:
In primo luogo, ho pensato che forse è dovuto alla compilazione x86, ma leggendo il prossimo post, ho scartato questa opzione:
The Double Byte Size in 32 bit and 64 bit OS
Non riesco a capire cosa sta succedendo qui. Qualsiasi aiuto sarà apprezzato.
--- EDIT CON PIU 'INFORMAZIONI ---
Sto usando VS2015. Ho aggiunto altre tre linee di debug:
log.Info(x);
log.Info(y);
log.Info(aux);
per mostrare i registri sto usando la libreria log4net. L'uscita è:
23322 [8] INFO Art.Model.Scenarios (null) - 348333,673899683
24745 [8] INFO Art.Model.Scenarios (null) - 4521014,98461396
26274 [8] INFO Art.Model.Scenarios (null) - 1574821822464
Quindi non è un bug nel debugger. Se creo un progetto e una soluzione completamente nuovi funziona, ma non riesco a capire perché non funzioni in questa soluzione.
--- SECONDO EDIT ---
Grazie ai commenti che ho provato qualcosa di nuovo:
double x = 348333.673899683;
double y = 4521014.98461396;
double aux = x * y;
decimal xx = 348333.673899683m;
decimal yy = 4521014.98461396m;
decimal auxx = xx * yy;
log.Info(x);
log.Info(y);
log.Info(aux);
log.Info(xx);
log.Info(yy);
log.Info(auxx);
e il risultato è:
16129 [8] INFO Art.Model.Scenarios (null) - 348333,673899683
16145 [8] INFO Art.Model.Scenarios (null) - 4521014,98461396
16145 [8] INFO Art.Model.Scenarios (null) - 1574821822464
16145 [8] INFO Art.Model.Scenarios (null) - 348333,673899683
16145 [8] INFO Art.Model.Scenarios (null) - 4521014,98461396
16145 [8] INFO Art.Model.Scenarios (null) - 1574821759346,0994982775213747
così funziona con il decimale ma non con il doppio. Qualcuno può spiegarlo? Non riesco a capire perché sta succedendo.
sei sicuro che non sia un problema di debugger? cosa dice Console.WriteLine? Eseguo questo codice nella finestra interattiva vs2015 C# e fornisce la risposta corretta – pm100
quale versione vs? – pm100
VS 2015 finestra di esecuzione U2: 1574821759346,0994 – Dbl