2009-12-16 33 views
10

Tôi đang xây dựng một ứng dụng web bằng cách sử dụng JQuery, Stripes, Spring và JPA (Hibernate).Tôi có nên tính toán tiền trong Javascript hoặc như một cuộc gọi AJAX không?

Tôi có một trang cho phép người dùng nhập một số chi tiết đơn hàng và mỗi lần onblur xảy ra trong trường giá, tôi có sự kiện JQuery được liên kết với trường tổng tất cả các trường giá (đây là tổng phụ) , tính 10% thuế và thêm thuế vào tổng phụ. Tôi cập nhật trang để hiển thị tổng phụ, thuế và tổng cộng.

Câu hỏi của tôi là, tôi có nên thực hiện phép tính này trong Javascript không? Nếu vậy, làm thế nào tôi có thể chắc chắn làm tròn vv đang làm việc một cách chính xác? Tôi hơi lo lắng về vấn đề chính xác.

Tôi có nên thực hiện cuộc gọi Ajax để thực hiện phép tính trong Java không?

Mọi lời khuyên sẽ tuyệt vời!

Trả lời

15

Theo quy tắc chung, bạn cần phải đo lường điều gì quan trọng đối với đơn đăng ký của mình. Nếu đó là độ chính xác tuyệt đối thì hãy thực hiện như một cuộc gọi AJAX vì có thể có sự khác biệt làm tròn giữa các trình duyệt, máy tính và hệ điều hành.

Khi tôi đang phát triển một trang web cho một công ty tôi đang làm việc cho cùng một vấn đề, tuy nhiên, chúng tôi quản lý sử dụng phần javascript bằng cách sử dụng một twist thông minh bằng cách sử dụng chỉ số nguyên arithmetics.

Bởi vì chúng tôi đã xử lý tiền tệ với hai chữ số, chúng tôi nhân với 10.000 và thực hiện các phép tính. Làm tròn đến số nguyên và chia cho 10.000 cắt kết quả thành hai chữ số thập phân.

Điều đó làm cho các chuyến đi khứ hồi độc đáo và nhất quán giữa trình duyệt và phía máy chủ.

+1

+ 1 từ tôi Paulo. Tôi không biết rằng JS có vấn đề chính xác với phép tính số học – ram

+1

Ram, ECMAScript sử dụng nhanh, nhưng không chính xác, tính toán nổi. Ví dụ: '.1 + .2 = 0.30000000000000004'. Ngay cả ECMAScript 5 sẽ có những vấn đề này, bởi vì hệ thống chính xác được đề xuất được coi là quá có vấn đề (rất chậm và có thể phá vỡ các ứng dụng hiện có) cho tiêu chuẩn. Nó sẽ là một vài năm trước khi một hệ thống chính xác thậm chí tiêu chuẩn hóa, hãy để một mình có sẵn. – eyelidlessness

+0

Chỉ cần cung cấp cho cùng một lời khuyên! –

0

Javascript không phải là ngôn ngữ tốt nhất để làm toán. Bạn sẽ tìm thấy một số biểu thức toán học đúng nhưng trả về false trong Javascript. Không thể nhớ chúng chính xác nhưng tôi phát hiện ra khi tôi đã làm một máy tính một lần.

Bạn có thể tìm hiểu về những phần tốt và xấu của Javascript đây: http://www.crockford.com/

+1

Nó thực sự không có gì đặc biệt về JavaScript. Bất kỳ ngôn ngữ nào sử dụng các số dấu phẩy động IEEE 754 (chỉ là về mọi thứ) đều có cùng vấn đề. –

2

bạn nên làm điều đó trên các mặt hàng (tôi giả sử bạn có xác nhận phía khách hàng của bạn tại chỗ) để người dùng có thể nhìn thấy tổng số (tôi sẽ ghét nếu chúng tôi thực hiện cuộc gọi đi vòng đến máy chủ để chỉ xem tổng số) và cũng làm điều đó ở phía máy chủ. Giảm giá trị từ POST sẽ không phải là một ý tưởng rất tốt vì ai đó với HTTPProxy có thể thay đổi những giá trị này nếu bạn chọn nó từ HTTP POST của bạn.

TamperIE một công cụ để làm xáo trộn HTTP GET và POST và một sandbox nơi bạn có thể chơi xung quanh với

Chỉnh sửa: Vâng, bạn có thể làm việc tính toán trong máy chủ bằng cách thực hiện cuộc gọi AJAX, nhưng bạn sẽ cần phải xác nhận tổng số anyways (chống lại số lượng sản phẩm + thuế) khi người dùng gửi đơn đặt hàng

3

Nếu bạn chấp nhận đơn đặt hàng, tôi khuyên bạn nên luôn thực hiện các tính toán ở phía máy chủ trước khi xác nhận đơn đặt hàng để tránh ai đó mạo hiểm dữ liệu được gửi từ khách hàng. Điều đó nói rằng, bạn có thể cập nhật động bằng JavaScript với một số từ chối trách nhiệm phù hợp về độ chính xác và sau đó trình bày cho người dùng tính toán phía máy chủ của bạn trước khi họ xác nhận đơn đặt hàng.

6

Mỗi comp.lang.javascript FAQ, Javascript sử dụng IEEE-754 và do đó, nó có độ chính xác 15-16 chữ số khi thực hiện phép toán dấu chấm động. Điều này là đủ cho các hoạt động tiền tệ, miễn là bạn sử dụng cùng một làm tròn trong Javascript mà bạn làm ở phía máy chủ.

Nhưng nếu bạn cần phải chắc chắn rằng nó chính xác trên bất kỳ và tất cả các trình duyệt, một cuộc gọi Ajax sẽ là hành động an toàn nhất.

0

Bạn nên sử dụng back-end, trong trường hợp của bạn là Java, để thực hiện các phép tính nghiêm ngặt của bạn vì không đảm bảo rằng dữ liệu sẽ không bị người dùng cuối làm xáo trộn vì lợi ích của họ. Và một khi bạn đã gửi cho họ một xác nhận về giá giả mạo, bạn đang ở trong bản chất ràng buộc bởi các điều khoản của hợp đồng mua hàng của bạn, ngay cả khi bạn biết họ đã giả mạo với tổng giá. Không có cách nào dễ dàng để bạn có thể chứng minh rằng họ đã giả mạo mã hoặc tính toán của bạn, và lần lượt sẽ bị thua lỗ. Sử dụng back-end, bạn đã có toàn quyền kiểm soát môi trường đó, bất kỳ lỗi hoặc tính sai lầm nào từ góc độ đó có thể được đổ lỗi cho bạn.

0

Mặc dù đây không phải là một câu hỏi SO (trao đổi là nơi tốt hơn tôi đoán), tôi sẽ không sử dụng nó trong phép tính số học trừ khi có thực sự yêu cầu. Nếu các điểm thập phân đang nhận được có liên quan, các còi báo động đang được báo động ...

Ví dụ, bạn có biết rằng:

0.1 + 0.2 = 0.30000000000000004 

vì vậy nếu bạn thực sự kiểm tra như 0.1 + 0.2 === 0.3 nó sẽ được false

Hoặc đây là cái tốt hơn:

  • typeof NaN là số NaN != NaNtrue. NHƯNG NaN !== NaN cũng true

Và đây là yêu thích của tôi:

var i = 1; 
i = i + ""; 
i + 1 //output will be "11" :) 
console.log(i);//output will be 1 
i - 1 = 0; // this part is the golden shot 

Mặc dù tôi không đồng ý 100% với các bài viết sau đây, tôi chắc chắn sẽ đề nghị để đọc:

The Top 10 Things Wrong with JavaScript

Nó có điểm rất đẹp.

+0

nhưng bạn có biết những điều 10 'sai' hàng đầu này thực sự làm cho javascript động và phù hợp để phát triển các loại động như trong phython không? – vibs2006

+0

@ vibs2006: năng động không có nghĩa là không phù hợp ... anyways Im sẽ không tranh luận, đó là một bài viết nó là tốt để đọc mặc dù tôi không đồng ý 100% .. mà chỉ nói rằng bạn phải biết những gì bạn đang làm với javascript .. giống như sự hiểu biết sâu sắc về nó.Oh bằng cách này tôi thực sự muốn hiểu cách 0.2 + 0.1! = 0.3 làm cho nó "năng động hơn" và "phù hợp hơn" – curiousBoy

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