2011-07-04 30 views
6

Tôi không biết nếu tôi là thiếu một cái gì đó rõ ràng ở đây nhưng ...Firefox và Javascript Quy định làm tròn

Trong IE, Opera và Chrome, tôi nhận được những gì tôi mong đợi từ con số làm tròn kết thúc bằng một 5:

125 toPrecision(2) => 130 
11.5 toPrecision(2) => 12 

Đây là những gì tôi mong đợi.

Firefox, tuy nhiên, là một chút nhiều hơn 'phức tạp' năng suất như sau:

125 toPrecision(2) => 120 //wtf!!! 
11.5 toPrecision(2) => 12 

Sau một chút đầu gãi, tôi đã đi đến kết luận rằng Firefox đang sử dụng một 'làm tròn thậm chí' quy tắc ở đâu, nếu chữ số trước 5 thậm chí còn số làm tròn xuống và nếu chữ số trước 5 là số lẻ số lượng đạn lên:

0.5 => 0 
1.5 => 2 
2.5 => 2 
3.5 => 4, etc. 

tôi đang sử dụng các kết quả được làm tròn để thử nghiệm các giải pháp sinh lời các câu hỏi kỹ thuật với giả đầu vào câu hỏi được tạo ngẫu nhiên. Đầu vào câu hỏi trong Chrome có thể là h = 1020 mm nhưng h = 1030 mm trong FF, Chrome hoặc Opera.

Tôi cần một hàm để làm tròn nhất quán, nghĩa là tôi muốn 0,00để làm tròn lên đến 0.000124 và tôi muốn 1234 tròn thành 1240 vì vậy tôi không thể sử dụng num = Math.floor (num + 0.5) đơn giản; Để làm phức tạp vấn đề một chút, tôi muốn biến đầu vào và sinh câu trả lời là đúng đến 3 khai quật sig trừ chữ số đầu tiên là 1, trong trường hợp mà tôi muốn 4 sig khai quật:

234.5 => 235 
134.5 => 134.5 

tôi đã bị hack một giải pháp cho 3 hoặc 4 sig digs tùy thuộc vào chữ số đầu tiên bằng cách chuyển đổi số thành một chuỗi và kiểm tra đầu tiên khác không, không dấu thập phân và ký tự không âm cho '1' - không đẹp, nhưng nó hoạt động. Tôi có thể làm một cái gì đó tương tự cho vấn đề làm tròn, kiểm tra xem chữ số để được làm tròn là một 5 nhưng tôi tự hỏi nếu có một giải pháp bit-khôn ngoan.

+0

"Tôi muốn 1234 đến 1240"? –

Trả lời

1

Xin hãy nhìn vào các bài kiểm tra ở đây

http://yuiblog.com/blog/2009/03/10/when-you-cant-count-on-your-numbers/

JavaScript có một kiểu số duy nhất: IEEE 754 đúp chính xác nổi điểm. Có một loại số duy nhất là một trong những tính năng tốt nhất của JavaScript. Nhiều loại số có thể là nguồn về độ phức tạp, nhầm lẫn và lỗi. A loại đơn giản là đơn giản hóa và ổn định.

Thật không may, điểm động nhị phân loại có một số hạn chế đáng kể là . Điều tồi tệ nhất là nó không thể đại diện chính xác số thập phân phân số, đó là một vấn đề lớn vì nhân loại đã và đang thực hiện thương mại bằng số thập phân trong thời gian dài, dài . Sẽ có lợi thế để chuyển sang hệ thống số nhị phân nhị phân, nhưng điều đó sẽ không xảy ra với . Kết quả là, 0,1 + 0,2 === 0,3 là sai, đó là nguồn gốc của rất nhiều nhầm lẫn.

Ngoài ra hãy xem các câu hỏi SO:

https://stackoverflow.com/questions/287744/good-open-source-javascript-math-library-for-floating-point-operations

https://stackoverflow.com/questions/744099/javascript-bigdecimal-library/1575569#1575569

+0

Bạn có thể đặt bản chất của thông tin đằng sau các liên kết nội tuyến vào câu trả lời của bạn không? Bằng cách này, thông tin sẽ vẫn có sẵn ngay cả khi các liên kết bị lỗi thời. –

+0

Chỉ người đầu tiên là bên ngoài – mplungjan

0

Về "Tôi muốn 0,00làm tròn lên đến 0,000124": Điều này không làm cho nhiều ý nghĩa vì không giống như 0,5, 1,5, 2,5, v.v., số thập phân 0,00không chính xác được thể hiện trong cơ số 2; do đó làm tròn của nó có thể cao hơn một chút (A) hoặc thấp hơn một chút (B) giá trị chính xác, trong đó (A) và (B) sẽ tạo ra các vòng tròn khác nhau: 0,000124 cho (A), 0,00cho (B).

Thậm chí nếu bạn nhận được số thập phân như 1,5 được làm tròn thành số nguyên sau một số phép tính, (1.5) .toPrecision (2) sẽ không nhất thiết mang lại giá trị gần nhất với giá trị chính xác. Lý do là giá trị chính xác có thể chỉ dưới 1.5, trong trường hợp này làm tròn chính xác là 1, không phải 2. Vấn đề này được gọi là tình trạng khó xử của nhà sản xuất bảng. Điều này cũng có nghĩa là nếu hai học sinh sử dụng các phương pháp hơi khác nhau (cả hai thay vì chính xác) và tròn xấp xỉ của chúng, chúng sẽ nhận được kết quả được làm tròn khác nhau (mặc dù xấp xỉ của chúng có thể rất gần nhau). Trong trường hợp của một tie như 0,00(được làm tròn đến 0,000124), tiến thoái lưỡng nan của nhà sản xuất bảng là không thể tránh khỏi trừ khi tất cả các tính toán được thực hiện chính xác hoặc thuật toán đặc biệt kiểm tra trường hợp tie.

Tuy nhiên, nếu kết quả chính xác là cà vạt hoặc rất gần với cà vạt, vẫn có thể kiểm tra xem học sinh đã trả lời (A) hoặc (B).

Các vấn đề liên quan