커뮤니티
상한가 수식중 0.00001의 의미
2012-03-15 13:39:57
543
글번호 48964
아래 상한가 계산하는 수식에서 +0.00001의 의미가 뭔가요?
if CodeCategory() == 2 then {
if date >= 20030721 then {
up1 = int(UpLimit/100+0.00001)*100;
up2 = int(UpLimit/100+0.00001)*100;
up3 = int(UpLimit/100+0.00001)*100;
up4 = int(UpLimit/50+0.00001)*50;
up5 = int(UpLimit/10+0.00001)*10;
up6 = int(UpLimit/5+0.00001)*5;
}
else {
up1 = int(UpLimit/1000+0.00001)*1000;
up2 = int(UpLimit/500+0.00001)*500;
up3 = int(UpLimit/100+0.00001)*100;
up4 = int(UpLimit/50+0.00001)*50;
up5 = int(UpLimit/10+0.00001)*10;
up6 = int(UpLimit/10+0.00001)*10;
}
}
Else {
up1 = int(UpLimit/1000+0.00001)*1000;
up2 = int(UpLimit/500+0.00001)*500;
up3 = int(UpLimit/100+0.00001)*100;
up4 = int(UpLimit/50+0.00001)*50;
up5 = int(UpLimit/10+0.00001)*10;
up6 = int(UpLimit/5+0.00001)*5;
}
답변 1
예스스탁 예스스탁 답변
2012-03-15 15:45:51
안녕하세요
예스스탁입니다.
식상 어떤 값을 계산시에
2510.456000000000과 같이 계산되어야 하는데
2510.455999999999와 같이 계산값이 도출되는 경우가 있습니다.
이문제는 근본적으로 예스랭귀지 문제는 아니며
컴퓨터 프로세서가 실수를 부동소수점형태의
테이터 표현방식을 사용함으로 인해서 소수를 이진수로
변환하는 과정에서 생기는 문제로 대부분의 컴퓨터에서 동일하게 일어나는 문제입니다.
이는 컴퓨터자체의 부동소숫점 계산 오류로
인터넷에서 해당 내용 검색하시면 여러 글들 보실 수 있습니다.
이런 부분을 해결하기 위해 아주 작은 값을 임의로 추가한 것입니다.
수식 작성시 이런오류가 자주 만나게 되는 대표적인 부분이 아래와 같은 식입니다.
매달 11일에 매수하고자 작성한 식인데 신호가 발생하지 않습니다.
var1 = FracPortion(sdate/100)*100;
if var1 == 11 then#매달 11일
buy();
MessageLog("%.20f",var1);
매세지로그를 보시면 11일에 값이 10.9999999~~입니다.
그러므로 11하고는 값이 같이 않으므로 신호가 발생하지 않게 됩니다
이런 문제를 해결하기 위해 아래와 같이 반올림함수를 사용하여
필요한 자리에서 반올림해서 사용하기도 합니다.
var1 = round(FracPortion(sdate/100)*100,0);
if var1 == 11 then#매당 10일
buy();
MessageLog("%.10f",var1);
즐거운 하루되세요
> 행복충전 님이 쓴 글입니다.
> 제목 : 상한가 수식중 0.00001의 의미
> 아래 상한가 계산하는 수식에서 +0.00001의 의미가 뭔가요?
if CodeCategory() == 2 then {
if date >= 20030721 then {
up1 = int(UpLimit/100+0.00001)*100;
up2 = int(UpLimit/100+0.00001)*100;
up3 = int(UpLimit/100+0.00001)*100;
up4 = int(UpLimit/50+0.00001)*50;
up5 = int(UpLimit/10+0.00001)*10;
up6 = int(UpLimit/5+0.00001)*5;
}
else {
up1 = int(UpLimit/1000+0.00001)*1000;
up2 = int(UpLimit/500+0.00001)*500;
up3 = int(UpLimit/100+0.00001)*100;
up4 = int(UpLimit/50+0.00001)*50;
up5 = int(UpLimit/10+0.00001)*10;
up6 = int(UpLimit/10+0.00001)*10;
}
}
Else {
up1 = int(UpLimit/1000+0.00001)*1000;
up2 = int(UpLimit/500+0.00001)*500;
up3 = int(UpLimit/100+0.00001)*100;
up4 = int(UpLimit/50+0.00001)*50;
up5 = int(UpLimit/10+0.00001)*10;
up6 = int(UpLimit/5+0.00001)*5;
}
다음글
이전글