2009-04-30 8 views
0

두 개의 7 자리 숫자 (소스 및 대상 레코드 수)를 취하여 목표 수의 누락 된 레코드 백분율을 계산하려고합니다.JSP에서 caclulating 및 부동 소수점 숫자 표시 문제

예를 들어 내 기록 개수는 소스의 경우 4084094, 대상의 경우 4081313 일 수 있습니다. 나는 또한 비율 CALC하기 위해 다음과 공식을 사용하고 있습니다 : ((1 - (대상/소스)) * 100) 내 예를 들어

을, 나는 약 0.0681 %의 값을 취득해야 내가 '

Java와 JSP에 익숙하지 않아 정확하게 백분율을 표시 할 수 없습니다. 0으로 반올림 한 값만있는 것 같습니다.

나는 BigDecimal도 시도했지만 아무 소용이 없습니다.

에도 다음과 같은 간단한 코드는 1-1의 값을 표시합니다, 그래서 나는 분명히 심각하게 잘못 뭔가를해야만하고있는 중이 야 :

<% 
BigDecimal percentMiss; 
long tmp = 600/500; 
percentMiss = BigDecimal.valueOf(tmp); 
%> 
<%=percentMiss.toString()%>-<%=tmp%> 

답변

2

문제는 다음 줄에

long tmp = 600/500; 

당신은 저장할 수 없습니다를 long에서 부동 소수점 숫자를 사용하는 대신 다음 코드를 사용하는 것이 좋습니다.

double tmp = (double)600/(double)500; 

을 선택하고 0에서 1 사이의 값을 가져야하는 tmp를 표시하십시오 (계산식을 500/600으로 변경해야하기 때문에 사례 1.2에서).

+0

두 번째 값도 double 값으로 변환 할 필요는 없지만 일반적으로 코드를 읽기 쉽도록 만듭니다 (적어도 imo ...) – Homes2001

+0

왜 600D와 500D가 아닌지 –

+0

이 경우 D는 더 짧을수록 사실입니다 ... 저는 변수와 함께 사용할 수있는 예제를 제공하고 싶습니다 (변수의 끝에 D를 추가하여 이중으로 변환 할 수 없기 때문에 ...)) ...) – Homes2001

3

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

번호를 표시하려면 DecimalFormat을 사용하는 것이 좋습니다. 당신은 JSTL을 사용하는 경우, 더 나은 솔루션을 사용하는 것입니다 format tags :

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

<fmt:formatNumber value="${value}" minFractionDigits="2" maxFractionDigits="2"/> 
+0

그는 실제로 두 개의 정수를 나눕니다. :) –

1

귀하의 문제는 600와 500는 정수 값, 그리고 그들 사이에 분열이 당신에 할당 정수 결과를 가질 것입니다 long 정수. 이 후 결과의 소수 부분이 사라지고 (두 번) 결과를 얻을 수 없습니다.

부분 결과를 얻으려면 나누기의 입력 값 중 하나 이상이 정수가 아니어야합니다. 당신은 double 또는 float,에 캐스팅하거나 리터럴 명시 적으로 이중 또는 다음과 같이 떠함으로써이를 달성 할 수 있습니다 그러나

500.0 // implicitly double 
500f // float literal 
500d // double literal 

, 더블/플로트 divison의 결과를 인쇄 할 것이다 종종 당신보다 더 많은 소수점이 the way these numbers are stored as binary fractions으로 인해 결과에 포함되어서는 안되는 경우에도 (예 : 1/100.100000001490116119384765625이 될 수 있습니다.)

java.lang.DecimalFormat을 사용하여 이러한 원치 않는 자릿수를 제거 할 수 있지만 BigDecimal은 내부적으로 소수 자릿수를 사용하므로 반올림 모드를 정확하게 제어하면서 실제로 올바른 결과를 제공하므로 더 나은 옵션입니다. 물론 이것은 이미 깨진 결과를 수정하기 위해 "부두 재료"가 아닌 계산을 위해 BigDecimal을 사용해야합니다.

new BigDecimal(600).divide(new BigDecimal(500)) 

자세한 내용은 API documentation for BigDecimal을 참조하십시오.

+1

틀린. 정수는 정수 나누기를 사용하며 정수 결과를가집니다. –

+0

당신 말이 맞아요. +1 –