r239 vs r240
......
3030
3131
##== 초기화 ==
3232
값을 미리 정의하여 초기화합니다. 중간에 --장난으로-- 계산에 사용되는 변수에 값을 부여한 채로 include 하더라도 이를 무시합니다.
33
{{{#!if this.as=a.toString(), this.bs=b.toString(), this.rs=0+0, this.ru=0+0, this.rb=0+0, this.ri=0+0, this.rp=0+0, this.i=0+0, this.tu=0, this.tv=1+0, this.tw=0, this.tx=0, this.ty=0, this.ea=0+0, this.eb=0+0, this.wa=0+0, this.wb=0+0, this.ps=false, this.ts=false, this.br=false, this.ns="", this.ma="", this.mb="", this.tm="", this.pd="000000000000000000"
33
{{{#!if this.as=a.toString(), this.bs=b.toString(), this.rs=0+0, this.ru=0+0, this.rb=0+0, this.ri=0+0, this.rp=0+0, this.i=0+0, this.tu=0, this.tv=1+0, this.tw=0, this.tx=0, this.ty=0, this.ea=0+0, this.eb=0+0, this.wa=0+0, this.wb=0+0, this.ps=false, this.ts=false, this.br=false, this.ns="", this.ma="", this.mb="", this.tm="", this.tn="", this.pd="000000000000000000"
3434
}}}{{{#!if this.al=as.length, this.bl=bs.length, this.ad=as.indexOf("."), this.bd=bs.indexOf(".")
3535
}}}{{{#!if ad!=-1
3636
소수점이 발견되는 자리 번호가 ad이므로 ad+1번에 해당되는 자리부터 끝까지 표기합니다.
......
160160
{{{#!if bb=bb.substr(0,bp-1), bp=bp-1
161161
}}}}}}
162162
163
유효성 검사에 쓰인 tm과 tn 값을 빈 문자열 값으로 초기화합니다.
164
{{{#!if tm="", tn=""
165
}}}
166
163167
##== 덧셈, 뺄셈 ==
164168
덧셈과 뺄셈 계산과정을 적어봅니다.
165169
{{{#!if (f=="+")||(f=="-")
......
14561460
}}}다시 정렬된 bu, bb의 값은 바뀌지 않습니다. bu, bb로 나눈 몫만큼 au, ab에서 감소시킨 다음 au와 ab를 다시 정렬시키며, au와 ab가 모두 0이 되면 더 이상 계산하지 않도록 br를 true로 반환합니다.
14571461
au와 ab의 값을 가져와 tu와 tv로 먼저 복제합니다.
14581462
{{{#!if tu=au, tv=ab
1459
}}}}}}
1463
}}}
14601464
그 다음 계산을 편하게 할 수 있도록 텍스트값으로 된 au, ab, bu, bb를 정수값으로 변환합니다.
14611465
{{{#!if au=+au, ab=+bb, bu=+bu, bb=+bb
14621466
}}}
......
14651469
{{{#if ts=((au<bu)||((au==bu)&&(ab<bb))), ts
14661470
{{{#if ps=true
14671471
}}}}}}
1468
!ts이러면 ① au>bu이거나, ② au==bu이고 ab>=bb인 경우입니다. !ts if 조건문으로 두고 ①의 경우, ②의 경우로 나눠 봅니다.
1469
{{{#!if !ts
1472
!ts이러면 ① au>bu이거나, ② au==bu이고 ab>=bb인 경우입니다. !ts이고 !ps(다음 자릿수로 계산을 넘기지 않음)임을 if 조건문으로 상태에서 진행합니다.
1473
{{{#!if !ts&&!ps
14701474
au를 bu로 나눈 몫을 tw로 정의합니다. 정수를 정수로 나누면 몫만 계산되며, 100,000,000,000,000,000 이상 999,999,999 999,999,999 이하의 한 정수를 100,000,000,000,000,000 이상의 다른 한 정수로 나눈 몫이므로 tw의 값은 최소 0 최대 9가 됩니다.
14711475
{{{#!if tw=au/bu
14721476
}}}
14731477
bu, bb를 각각 tw만큼 곱한 값을 tx, ty로 정의합니다.
14741478
{{{#!if tx=bu*tw, ty=bb*tw
14751479
}}}
1476
이 때 ty가 19자리가 되면 넘친 첫번째 자리 tx의 일의 자리로 더합니다. tx는 19자리 숫자가 되어도 문제가 없습니다.
1477
이렇게 하면 tw*bu<=au가 됩니다. (bu가 au보다 크면 tw는 0이 됩니다.)
1480
이 때 ty가 19자리가 되면 넘친 첫번째 자리 값을 tx의 일의 자리로 더하고 아래 18자리의 값을 ty로 다시 정의합니다. tx는 19자리 숫자가 되어도 문제가 없습니다.
1481
{{{#!if ty=ty.toString(), ty.length==19
1482
{{{#!if tx+=+(ty.substr(0,1)), ty=ty.substr(1,18), ty=+ty
1483
}}}}}}
1484
이렇게 하면 tx=bu*tw<=au가 됩니다. (bu가 au보다 크면 tw는 tw의 정의에서 값이 0이 되므로 부등호가 성립됩니다.)
1485
(2.1/1.6 처럼) ty가 넘쳐 tx 값이 더해지는 경우가 있으므로 몫이 유효한 값인지 검산합니다. 만일 tx ty 가 기존 au ab을 넘게 되면 tw에서 1을 빼고, tx, ty를 다시 정의합니다.
1486
{{{#!if (tx>au)||((tx==au)&&(ty>ab))
1487
{{{#!if tw-=1, tx=bu*tw, ty=bb*tw
1488
}}}
1489
마찬가지로 ty가 19자리가 된다면 넘친 첫번째 자리의 값을 tx의 일의 자리로 더합니다.
1490
{{{#!if ty=ty.toString(), ty.length==19
1491
{{{#!if tx+=+(ty.substr(0,1)), ty=ty.substr(1,18), ty=+ty
1492
}}}}}}}}}
1493
이렇게 만들어진 tx, ty가 있으면 이를 반영합니다.
1494
}}}
1495
ps일 경우 tm의 오른쪽에 "0"을 더합니다.
1496
{{{#!if ps
1497
{{{#!if tm+="0"
1498
}}}}}}
1499
!ps일 경우 tm의 오른쪽에 tw를 문자열로 바꾼 텍스트를 더합니다.
1500
{{{#!if !ps
1501
{{{#!if tw=tw.toString(), tm+=tm
1502
}}}}}}
14781503
14791504
1480
14811505
##rs 매기기
14821506
14831507
##ru 매기기
......
14851509
##rb 매기기
14861510
14871511
##ri 매기기
1512
1513
여기까지가 나눗셈의 계산과정입니다.
14881514
}}}
14891515
1516
연산이 끝났으면 표기된 숫자를 정리합니다.
1517
14901518
##ru 정리 부분
14911519
먼저 ru를 문자열로 변환합니다. 18자리씩 끊어 표기하므로 소수점 위 19~36번째 자리에 해당하는 rs값이 (곱한 값을 더했는데도) 0일 경우 rs를 빈 문자열로 바꿉니다. 곱셈과정에서 ru의 윗자리인 rs값이 0보다 클 경우, 1~18번째 자리인 ru에 빈 자리를 채우도록 ru의 왼쪽을 0으로 채웁니다.
14921520
{{{#!if ru=ru.toString()
......