문제

두 개의 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).

다른 팁

문제는 분명히 두 개의 긴 숫자를 나누고 있다는 것입니다.

사용하는 것이 좋습니다 십진법 번호를 표시합니다. JSTL을 사용하는 경우 더 나은 솔루션은 형식 태그:

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

<fmt:formatNumber value="${value}" minFractionDigits="2" maxFractionDigits="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 자세한 내용은.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top