Wenn JavaScript-Nummer und C# -Doppel gleich spezifiziert sind (IEEE 754), warum werden Zahlen mit vielen signifikanten Ziffern anders behandelt?Warum werden Zahlen mit vielen signifikanten Stellen in C# und JavaScript anders behandelt?
var x = (long)1234123412341234123.0; // 1234123412341234176 - C#
var x = 1234123412341234123.0; // 1234123412341234200 - JavaScript
Ich bin nicht mit der Tatsache besorgt, dass IEEE 754 nicht die Zahl darstellen kann 1234123412341234123. ich mit der Tatsache, bin besorgt, dass die beiden Implementierungen nicht das gleiche für Zahlen handeln, die nicht mit voller Genauigkeit dargestellt werden.
sein Dies kann, weil IEEE 754 unter angegeben ist, eine oder beiden Implementierungen fehlerhaft sind oder dass sie verschiedene Varianten von IEEE implementieren 754.
Dieses Problem zu Problemen ist nicht im Zusammenhang mit Punkt Ausgabe in C# Formatierung schweben. Ich gebe 64-Bit-Ganzzahlen aus. Beachten Sie Folgendes:
long x = 1234123412341234123; Console.WriteLine(x); // Prints 1234123412341234123 double y = 1234123412341234123; x = Convert.ToInt64(y); Console.WriteLine(x); // Prints 1234123412341234176
Die gleiche Variable druckt verschiedene Saiten, da die Werte unterschiedlich sind.
Warum bist du zu lang? –
Sie vergleichen ein Doppel mit einem Float, denke ich. Wenn Sie in der Lage sein möchten, mit großen Zahlen zu rechnen, empfehle ich Ihnen, http://mikemcl.github.io/decimal.js/ zu verwenden und String-Nummern anzugeben, um die Anzahl der gewünschten Ziffern zu erhalten. Dies beantwortet Ihre Frage nicht, könnte aber ein wenig helfen, wenn Sie ein Problem haben. Große Zahlen werden normalerweise als Formelwert gespeichert und dadurch können Rundungsfehler auftreten. Deshalb sind Gleitkommawerte nicht präzise. Sie könnten in eine große Anzahl von Ungenauigkeiten in Javascript gestolpert haben. Zum Grund vielleicht schauen Sie in https://code.google.com/p/v8/ – Tschallacka
Es gibt ein anderes interessantes Problem hier ... Das .NET zeigt normalerweise nur 15 Stellen der Präzision, anstelle der vollen 17. – xanatos