Se il numero di codice JavaScript e il numero doppio di C# sono specificati allo stesso modo (IEEE 754), perché i numeri con molte cifre significative vengono gestiti in modo diverso?Perché i numeri con molte cifre significative sono gestiti in modo diverso in C# e JavaScript?
var x = (long)1234123412341234123.0; // 1234123412341234176 - C#
var x = 1234123412341234123.0; // 1234123412341234200 - JavaScript
Non mi interessa il fatto che IEEE 754 non può rappresentare il numero 1234123412341234123. Mi preoccupa il fatto che le due implementazioni non agiscono lo stesso per i numeri che non possono essere rappresentati con precisione completa.
Ciò può essere dovuto al fatto IEEE 754 è sotto specificato, una o entrambe le implementazioni sono guasti o che prevedano l'impiego di diverse varianti di IEEE 754.
Questo problema non è correlato a problemi con floating point uscita formattazione in C#. Sto emettendo numeri interi a 64 bit. Si consideri il seguente:
long x = 1234123412341234123; Console.WriteLine(x); // Prints 1234123412341234123 double y = 1234123412341234123; x = Convert.ToInt64(y); Console.WriteLine(x); // Prints 1234123412341234176
Le stesse stampe variabili diverse stringhe perché i valori sono diversi.
Perché lanci a lungo? –
Si sta confrontando un doppio con un float, penso. se vuoi essere in grado di calcolare con grandi numeri ti consiglio di usare http://mikemcl.github.io/decimal.js/ e di fornire numeri di tipo stringa per ottenere il numero di cifre che desideri. Questo non risponde alla tua domanda, ma potrebbe aiutare un po 'se stai affrontando un problema. I grandi numeri di solito vengono salvati come valore di formula e gli errori di arrotondamento possono verificarsi a causa di ciò. Ecco perché i punti fluttuanti non sono precisi. Potresti esserti imbattuto in una grande imprecisione di arrotondamento in javascript. Per quanto riguarda la ragione, forse guarda https://code.google.com/p/v8/ – Tschallacka
C'è un altro problema interessante qui ... .NET normalmente mostra solo 15 cifre di precisione, invece del pieno 17. – xanatos