2009-12-16 3 views
10

JQuery, Stripes, Spring, JPA (Hibernate)를 사용하여 webapp을 만들고 있습니다.Javascript에서 또는 AJAX 호출로 돈 계산을 수행해야합니까?

사용자가 여러 주문 광고 항목을 입력 할 수있는 페이지가 있으며 onblur이 가격 필드에 나타날 때마다 모든 가격 필드를 합한 필드에 바인딩 된 JQuery 이벤트가 있습니다 (이 부분은 소계입니다) , 10 % 세금을 계산하고 부분 합계에 세금을 추가합니다. 소계, 세금 및 총액을 표시하는 페이지를 업데이트합니다.

제 질문은 자바에서이 계산을 수행해야합니까? 그렇다면 반올림 등이 올바르게 작동하는지 어떻게 확인할 수 있습니까? 저는 정밀도 문제에 대해 조금 걱정합니다.

Java에서 계산을 수행하기 위해 Ajax 호출을하는 것이 더 좋을까요?

모든 조언은 훌륭합니다!

답변

15

어림짐작으로서, 귀하는 귀하의 신청서에 중요한 사항을 측정해야합니다. 절대 정밀도라면 브라우저, 컴퓨터 및 OS간에 반올림 차이가있을 수 있으므로 AJAX 호출로 사용하십시오.

내가 일하는 회사의 사이트를 개발할 때 같은 문제가 있었지만 정수 연산만을 사용하여 똑똑한 비꼬임을 사용하여 자바 스크립트 부분을 사용했습니다.

두 자리로 통화를 처리 했으므로 모든 것을 10,000으로 곱하고 계산했습니다. 정수로 반올림 한 다음 소수점 두 자리까지 결과를 자르는 10,000으로 나눈 값입니다.

이렇게하면 브라우저와 서버 측 사이를 왕복하고 편리하게 왕복 할 수 있습니다.

+1

+ 1 Paulo에서. JS가 산술 계산에 정밀 문제가 있다는 것을 알지 못했습니다. – ram

+1

램, ECMAScript는 빠르고 정확하지만 부동 계산을 사용합니다. 예를 들어'.1 + .2 = 0.30000000000000004'입니다. ECMAScript 5조차도 제안 된 정밀 시스템이 표준에 대해 너무 문제가있는 것으로 간주되어 (매우 느리고 기존 응용 프로그램이 손상 될 수 있기 때문에) 이러한 문제가 발생합니다. 정확한 시스템이 표준화되기까지는 몇 년 더 걸릴 것입니다. – eyelidlessness

+0

똑같은 조언을하려고합니다! –

0

자바는 수학을 수행하는 데 최고의 언어가 아닙니다. 당신은 사실이지만 Javascript에서 false를 반환하는 몇 가지 수학 표현식을 찾을 수 있습니다. 정확하게 기억할 수는 없지만 한 번 계산기를 할 때 알아 냈습니다.

현재 자바 스크립트의 좋고 나쁜 부분에 대해 알 수

: 이 http://www.crockford.com/

+1

JavaScript에 대한 특별한 것은 아닙니다. IEEE 754 부동 소수점 숫자를 사용하는 언어 (모든 것에 대해)는 동일한 문제가 있습니다. –

2

클라이언트 측 (난 당신이 장소에 클라이언트 측 유효성 검사기가 있다고 가정) 사용자가 볼 수 있도록 그것을해야 전체 (나는 우리가 합계를 볼 수있는 서버에 왕복 전화를 걸면 싫어한다.) 또한 서버 측에서 수행한다. POST로부터의 값을 읽는 것은 HTTPProxy를 가진 누군가가 바뀔 수 있기 때문에 아주 좋은 생각이 아니다. 이 값은 HTTP POST에서 가져 오는 값입니다.

TamperIE HTTP GET 및 POST 및

편집 함께 놀러 수있는 sandbox을 조작하는 도구 : 예, 당신이 AJAX 호출을하여 서버에서 계산을 수행 할 수 있습니다,하지만 당신은해야합니다 사용자가 주문서를 제출할 때 어쨌든 합계 (제품 수와 비교하여 + 세금)를 확인하십시오.

3

주문을 수락하는 경우 클라이언트에서 데이터를 악의적으로 조작하지 못하도록 주문을 확인하기 전에 항상 서버 측에서 계산하는 것이 좋습니다. 그렇다면 자바 스크립트를 사용하여 역동적 인 업데이트를 수행 할 수 있습니다. 여기에는 정확성에 대해 적절히 언급 된 면책 조항이 포함되어 있습니다. 그런 다음 주문을 확인하기 전에 서버 측 계산을 사용자에게 제시하십시오.

6

comp.lang.javascript FAQ에 따르면 Javascript는 IEEE-754를 사용하므로 부동 소수점 연산을 수행 할 때 15-16 자리의 정밀도를 갖습니다. 이는 서버 측에서 수행하는 Javascript에서 동일한 반올림을 사용하는 경우 통화 조작에 충분해야합니다.

그러나 모든 브라우저에서 올바른지 확인해야하는 경우 Ajax 호출이 가장 안전한 방법입니다.

0

엄격한 계산을 수행하려면 백 엔드를 사용해야합니다 (예 : Java 인 경우). 데이터가 최종 사용자의 이익을 위해 조작되지 않는다고 보장 할 수는 없습니다. 그리고 일단 당신이 훼손된 가격에 대한 확인을 보내면, 총 가격을 훼손했다는 것을 알고 있더라도, 구매 계약의 조건에 구속됩니다. 코드 나 계산을 변경했음을 입증 할 수있는 쉬운 방법은 없으며, 그 결과로 손실이 발생합니다. 백엔드를 사용하면 해당 환경을 완벽하게 제어 할 수 있습니다. 그 각도의 버그 또는 오판이 당신에게 정당하게 비난 될 수 있습니다.

0

비록 이것은 정말 문제가되지 않는 한 (교환이 더 나은 장소라고 생각합니다.) 실제로 필요한 경우가 아니면 산술 계산에 사용하지 않을 것입니다. 진수 지점이 관여하는 경우, 사이렌, 예를 들어

... 놀라게하는 당신이 알고 않았다 당신이 실제로 0.1 + 0.2 === 0.3로 확인하면 그렇게 될 것

0.1 + 0.2 = 0.30000000000000004 

false

또는 여기에 더 나은 하나입니다

  • typeof NaN 숫자 NaN != NaNtrue입니다. 나는 다음과 같은 기사에 100 % 동의하지 않는다하더라도

    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 
    

    , 나는 확실히 읽을 제안 :하지만 NaN !== NaNtrue

그리고 여기 내 좋아하는

The Top 10 Things Wrong with JavaScript

정말 좋은 점이 있습니다.

+0

하지만 당신은 이러한 상위 10 '잘못된'것들이 실제로 자바 스크립트를 동적으로 만들고 phython과 같은 동적 유형을 개발하는 데 적합하다는 것을 알고 있습니까? – vibs2006

+0

@ vibs2006 : 역동적 인 것이 일관성이 없다는 것을 의미하지는 않습니다 ... 어쨌든 논쟁하지 않으려 고합니다. 그것은 100 % 동의하지는 않지만 읽는 것이 좋은 기사입니다. 단지 당신이 당신이 무엇을하고 있는지를 알고 있다고 말해줍니다. 자바 스크립트 .. 그것의 깊은 이해처럼.오, 그런데 0.2 + 0.1! = 0.3을 이해하면 정말 "더 역동적"이고 "더 적합한" – curiousBoy

관련 문제