Nếu số của JavaScript và C# đôi được chỉ định giống nhau (IEEE 754), tại sao các số có nhiều chữ số có nghĩa được xử lý khác nhau?Tại sao các số có nhiều chữ số có ý nghĩa được xử lý khác nhau trong C# và JavaScript?
var x = (long)1234123412341234123.0; // 1234123412341234176 - C#
var x = 1234123412341234123.0; // 1234123412341234200 - JavaScript
Tôi không quan tâm đến thực tế là IEEE 754 không thể đại diện cho số 1234123412341234123. Tôi lo ngại với thực tế là hai ngôn ngữ này không hành động tương tự cho số mà không thể được đại diện một cách chính xác đầy đủ.
này có thể do IEEE 754 đang được chỉ định, một hoặc cả hai hiện thực đang bị lỗi hoặc rằng họ thực hiện các biến thể khác nhau của IEEE 754.
Vấn đề này không liên quan đến các vấn đề với sản lượng điểm định dạng trong C# nổi. Tôi đang xuất ra các số nguyên 64 bit. Hãy xem xét những điều sau đây:
long x = 1234123412341234123; Console.WriteLine(x); // Prints 1234123412341234123 double y = 1234123412341234123; x = Convert.ToInt64(y); Console.WriteLine(x); // Prints 1234123412341234176
Các bản in cùng một biến chuỗi khác nhau vì các giá trị khác nhau.
Tại sao bạn truyền đến lâu? –
Bạn đang so sánh một đôi với một phao tôi nghĩ. nếu bạn muốn để có thể tính toán với số lượng lớn lớn, tôi đề nghị bạn sử dụng http://mikemcl.github.io/decimal.js/ và cung cấp số chuỗi loại để có được số chữ số bạn muốn. Điều này không trả lời câu hỏi của bạn nhưng có thể giúp ích một chút nếu bạn đang gặp phải vấn đề. Số lớn thường được lưu dưới dạng giá trị công thức và lỗi làm tròn có thể xảy ra do đó. Đó là lý do tại sao các điểm nổi không chính xác. Bạn có thể đã vấp ngã vào một số lớn làm tròn không chính xác trong javascript. Đối với những lý do có thể nhìn vào https://code.google.com/p/v8/ – Tschallacka
Có một vấn đề thú vị ở đây ... Các NET thường chỉ cho thấy 15 chữ số chính xác, thay vì toàn bộ 17. – xanatos