2013-06-20 6 views
-1

아래의 문제에 놀랐습니다. 두 개의 값이 TextBox T1 및 T2로 나누어 져 있습니다. 나는 금액을 얻으려고 똑같은 것을 나누고 정확한 금액을 얻지 않습니다. 오히려 다음 분수에 00000001자바 스크립트 디바이더 문제

Example: 
var t1=5623.52; 
var t2=56.2352; 
var t3=5623.52/56.2352; //100.0000000001 

참고 금액을 받고 다음 알엇은 환율 때문에 통화에 따라 달라질 수 있기 때문에 나는 값을 반올림 수 없습니다.

+3

그래서 무엇이 문제입니까? – Prinzhorn

+0

정확한 금액을 받으시겠습니까 ?? – karthi

+0

부동 소수점 숫자는 어떻게 작동합니까? – alex

답변

1

부동 소수점 값의 정밀도가 제한되어 있기 때문에 발생합니다. 자세한 내용은 The Floating Point Guide을 참조하십시오.

약식으로 1/3을 십진수로 나타낼 수없는 것처럼 짧은 숫자는 0.52 숫자의 소수 부분을 정확하게 이진 형식으로 나타낼 수 없다는 것입니다. 제한된 숫자의 정확성 때문에 더 큰 숫자는 작은 것보다 약간 더 정확하므로 정확하게 정확히 100 배가 아닙니다.

그게 이해가되지 않는다면, 은 1/3을 다루는이고 10 진수로 10 진수로 표시되는 척하는 것으로 상상해보십시오. 당신이 선언하면 :

var t1 = 1000.0/3.0; 
var t2 = 10.0/3.0; 

그런 다음 t2은 주어진 정밀도로 표현 될 수있는만큼 가까이있는 3.3333333333으로 표시됩니다. t2의 100 배인 값은 333.3333333300이지만 t1은 실제로는 333.3333333333으로 표시됩니다. 다른 숫자에 대해 다른 지점에 반올림/잘라 내기가 적용되므로 이 아니며 정확히 100 번 t2입니다.


부동 소수점 반올림 문제가있는 항상 그렇듯이 해결 방법은 십진수 형식을 사용하는 것입니다. 위의 가이드에서 Javascript cheat-sheet을보고이 문제를 해결할 방법을 찾아보십시오.

+0

해결책을 가져 주셔서 감사합니다. 그러나 치트 시트에 나와 있듯이 parseFloat()는 필수 값 100을 반환하지 않습니다. 대신 부동 소수점 숫자를 반올림하기 위해 toPrecision() 또는 toFixed()를 사용할 수 없습니다. – Sravan

0

Felix Kling이 말했듯이 부동 소수점 값을 사용하지 마십시오. 정수를 유지하려면 parseInt를 사용하십시오.

var t1=5623.52; 
var t2=56.2352; 
var t3=parseInt(t1/t2);