Jeśli liczba i numer JavaScript w języku JavaScript są takie same (IEEE 754), dlaczego numery z wieloma znaczącymi cyframi są traktowane inaczej?Dlaczego liczby o wielu znaczących cyfrach są obsługiwane inaczej w C# i JavaScript?
var x = (long)1234123412341234123.0; // 1234123412341234176 - C#
var x = 1234123412341234123.0; // 1234123412341234200 - JavaScript
I nie chodzi mi o to, że IEEE 754 nie może reprezentować liczbę 1234123412341234123. obawiam się z faktem, że dwie implementacje nie działają takie same numery, które nie mogą być reprezentowane z pełną precyzją.
To może być fakt, IEEE 754 jest pod określony, jedna lub obie implementacje są wadliwe lub które realizują różne warianty IEEE 754.
Ten problem nie jest związany z problemami z zmiennoprzecinkowych formatowania wyjścia w języku C#. Generuję 64-bitowe liczby całkowite. Rozważmy następujący:
long x = 1234123412341234123; Console.WriteLine(x); // Prints 1234123412341234123 double y = 1234123412341234123; x = Convert.ToInt64(y); Console.WriteLine(x); // Prints 1234123412341234176
Te same zmienne drukuje różne ciągi ponieważ wartości są różne.
Dlaczego rzucasz na długo? –
Porównujesz podwójne z floatem, które myślę. Jeśli chcesz mieć możliwość liczenia dużych liczb, sugeruję użycie adresu http://mikemcl.github.io/decimal.js/ i podanie numerów typu ciągu, aby uzyskać pożądaną liczbę cyfr. To nie odpowiada na twoje pytanie, ale może trochę pomóc, jeśli napotkasz problem. Duże liczby są zwykle zapisywane jako wartość formuły, co może powodować błędy zaokrąglania. Dlatego zmienne punkty nie są precyzyjne. Mogłeś wpaść na dużą niedokładność zaokrąglania liczb w javascript. Jeśli chodzi o powód może zajrzeć do https://code.google.com/p/v8/ – Tschallacka
, jest tu jeszcze jeden interesujący problem ... .NET zwykle pokazuje 15 cyfr precyzji, zamiast pełnego 17. – xanatos