안규 공부방

ACTIVE SERVER PAGE > ASP - 소수점 처리 예제들

등록일 : 2021-05-13 15:09 조회수 : 94,403

1. ROUND

ASP에서 Round 함수는 반올림을 해 주는 역할을 하는 함수이다.  그러나, 이것을 사용하다 보면 예기치 않은 오류가 생기곤 한다.

Round(1002.15 ,1) 
Round(1002.145 ,2) 
Round(1002.1445 ,3) 
Round(1002.14445 ,4) 

Round(1002.16 ,1) 
Round(1002.146 ,2)
Round(1002.1446 ,3)
Round(1002.14446 ,4)
%>

우리가 기대한 결과는 당연히 아래과 같을 것이다.
1002.2
1002.15
1002.145
1002.1445

1002.2
1002.15
1002.145
1002.1445

하지만 실제로 실행을 해 보면 아주 다른 결과가 나온다. ㅡㅡ;

1002.2
1002.14
1002.144
1002.1444

1002.2
1002.15
1002.145
1002.1445

1002.145 는 내부적으로 1002.14444444444444444444449 와 같이 관리되는듯 하고,
1002.146 은 내부적으로 1002.14555555555555555555559 와 같이 관리되는듯 하다.

그래서 소수 2번째에서 반올림을 하게 되면 1002.144 에서 반올림을 하므로 결과값은 1002.14가 되는것이고
1002.145에서 반올림하므로 1002.15가 되는것이다.


그런데 희안한것은 소수 첫째짜리에서 반올림할때는 제대로 계산이 되어진다는것이다. 멀까.. ㅠㅠ


2. FormatNumber

ASP의 또다른 함수 FormatNumber함수를 이용해 보도록 하겠다.

FormatNumber(1002.15 ,1)
FormatNumber(1002.145 ,2)
FormatNumber(1002.1445 ,3)
FormatNumber(1002.14445 ,4)

FormatNumber(1002.16 ,1)
FormatNumber(1002.146 ,2)
FormatNumber(1002.1446 ,3)
FormatNumber(1002.14446 ,4)


결과는 아래와 같다.
1,002.2
1,002.15
1,002.145
1,002.1445

1,002.2
1,002.15
1,002.145
1,002.1445


반올림이 잘 되어있다. 원래 FormatNumber 함수는 숫자의 표현형식을 지정하는 함수인데 반올림도 된다.
그런데 여기서 또하나의 문제점!! 바로 천단위마다 콤마(,)가 찍힌다는 것이다. 이는 내부적으로 계산할 경우에는 오류를 발생시킨다.

[CDbl]

위의 오류를 해결하기 위해 소수점이 있는 숫자이므로  CDbl함수를 이용하여 더블형으로 변환을 시켜주면 해결이 된다.


<%
CDbl(FormatNumber(1002.15 ,1))
CDbl(FormatNumber(1002.145 ,2))
CDbl(FormatNumber(1002.1445 ,3))
CDbl(FormatNumber(1002.14445 ,4))

CDbl(FormatNumber(1002.16 ,1))
CDbl(FormatNumber(1002.146 ,2))
CDbl(FormatNumber(1002.1446 ,3))
CDbl(FormatNumber(1002.14446 ,4))
%>


결과는
1002.2
1002.15
1002.145
1002.1445

1002.2
1002.15
1002.145
1002.1445

짜잔~!! 이제 이렇게 사용하면 된다. ^^


[TIP]
숫자형 변환 함수중에 정수로 변환하는 함수는 Int와 CInt가 있다.
Int 함수는 소수점 첫째자리에서 버림을 하고 CInt 함수는 소수점 첫째자리에서 반올림을 한다는 차이점이 있다.

그래서 테스트해 봤을때, 역시 예상대로 반올림에 문제가 발생한다.

CInt(1002.5)
CInt(1002.6)
CInt(1002.47)
Int(1002.9)

위의 코드대로 라면 분명 아래와 같은 결과를 예상할 것이다.
1003
1003
1002
1002


그러나 결과는 다음과 같다.
1002
1003
1002
1002


역시 반올림이 제대로되지 않는다.


이 부분들 유의하시어 무한삽질에 빠지지 않도록~~~~~



 
※ 혹시 도움이 되셨다면 댓글에 한마디 남겨주세요!
작성자   비밀번호
자동글 방지     (자동글 방지 기능입니다.)
내용   댓글달기 
이메일 문의 : cak0280@nate.com  
Copyright 2000 By ENTERSOFT.KR All Rights Reserved.