JSP의 부동 소수점 번호 계산 및 표시
-
03-07-2019 - |
문제
두 개의 7 자리 숫자 (소스 및 대상 레코드 수)를 가져 와서 대상 수의 누락 된 레코드의 백분율을 계산하려고합니다.
예를 들어, 내 레코드 카운트는 소스의 경우 4084094, 대상의 경우 4081313 일 수 있습니다. 또한 다음 공식을 사용하여 백분율을 계산합니다. ((1- (Target / Source)) * 100)
예를 들어, 나는 약 .0681%의 가치를 얻어야합니다.
저는 Java와 JSP를 처음 접했으며 비율을 올바르게 표시 할 수 없습니다. 나는 단지 값을 0으로 줄인 것 같습니다.
나는 또한 BigDecimal을 시도했지만 아무 소용이 없습니다.
다음 간단한 코드조차도 1-1의 값을 표시하므로 분명히 심각하게 잘못하고 있습니다.
<%
BigDecimal percentMiss;
long tmp = 600/500;
percentMiss = BigDecimal.valueOf(tmp);
%>
<%=percentMiss.toString()%>-<%=tmp%>
해결책
문제는 다음 줄에 있습니다
long tmp = 600/500;
플로팅 포인트 번호를 길게 저장할 수 없으며 대신 다음 코드를 사용하는 것을 고려해야합니다.
double tmp = (double)600 / (double)500;
그런 다음 TMP를 표시합니다. TMP는 0에서 1 사이의 값을 가져야합니다 (계산을 500 / 600으로 변경해야하기 때문에 1.2의 경우 1.2).
다른 팁
당신의 문제는 600과 500이 정수 값이며, 그 사이의 구분은 정수 결과를 가져 오며 긴 정수에 할당됩니다. 그 후, 결과의 분수 부분은 사라지고 (두 번) 되돌릴 수 없습니다.
분수 결과를 얻으려면 분할의 입력 값 중 하나 이상이 비 인식이어야합니다. 당신은 그들을 캐스팅하여 이것을 달성 할 수 있습니다 double
또는 float
, 또는 리터럴을 다음과 같이 명시 적으로 두 배로 또는 플로팅하게함으로써 :
500.0 // implicitly double
500f // float literal
500d // double literal
그러나 더블/플로트 디비 슨의 결과는 종종 결과에 없어야하더라도 원하는 것보다 더 많은 자리를 갖습니다 (예 : 1/10
발생할 수 있습니다 0.100000001490116119384765625
), 때문에 이 숫자는 이진 분획으로 저장됩니다.
사용하여 원치 않는 숫자를 제거 할 수 있습니다 java.lang.DecimalFormat
, 하지만 BigDecimal
내부적으로 소수점 분수를 사용하므로 반올림 모드에 대한 정확한 제어를 제공하면서 실제로 올바른 결과를 제공하기 때문에 더 나은 옵션입니다. 물론, 이것은 당신이 사용해야합니다 BigDecimal
이미 깨진 결과를 수정하기 위해 "부두 성분"이 아닌 계산 자체의 경우.
new BigDecimal(600).divide(new BigDecimal(500))
읽기 API 문서 BigDecimal
자세한 내용은.