r3 vs r4
......
6161
{{{#!if wb=1, bb=bb.substr(0,18), bp=18
6262
}}}}}}{{{#!if ts=(((bb[0]==null)||((bb[0]>=48)&&(bb[0]<=57)))&&((bb[1]==null)||((bb[1]>=48)&&(bb[1]<=57)))&&((bb[2]==null)||((bb[2]>=48)&&(bb[2]<=57)))&&((bb[3]==null)||((bb[3]>=48)&&(bb[3]<=57)))&&((bb[4]==null)||((bb[4]>=48)&&(bb[4]<=57)))&&((bb[5]==null)||((bb[5]>=48)&&(bb[5]<=57)))&&((bb[6]==null)||((bb[6]>=48)&&(bb[6]<=57)))&&((bb[7]==null)||((bb[7]>=48)&&(bb[7]<=57)))&&((bb[8]==null)||((bb[8]>=48)&&(bb[8]<=57)))&&((bb[9]==null)||((bb[9]>=48)&&(bb[9]<=57)))&&((bb[10]==null)||((bb[10]>=48)&&(bb[10]<=57)))&&((bb[11]==null)||((bb[11]>=48)&&(bb[11]<=57)))&&((bb[12]==null)||((bb[12]>=48)&&(bb[12]<=57)))&&((bb[13]==null)||((bb[13]>=48)&&(bb[13]<=57)))&&((bb[14]==null)||((bb[14]>=48)&&(bb[14]<=57)))&&((bb[15]==null)||((bb[15]>=48)&&(bb[15]<=57)))&&((bb[16]==null)||((bb[16]>=48)&&(bb[16]<=57)))&&((bb[17]==null)||((bb[17]>=48)&&(bb[17]<=57)))), br=ts?br:true, eb=ts?0:7
6363
}}}}}}}}}
64
6564
##== 2차 초기화 ==
66
유효성 검사가 종료되었으면 ts와 br, ps를 false로 초기화합니다 유효성 검사에 쓰인 tm과 tn 값을 빈 문자열 값으로 초기화합니다.
6765
{{{#!if tm="", tn="", ts=false, br=false, ps=false
68
}}}
69
70
입력한 소수점 아래에 입력한 값을 정리합니다. 이에 따라 ap, bp값도 다시 조정됩니다.
71
○○○○○○○○○□□□□○○□□○ 과 같이 9칸, 4칸, 2칸, 2칸, 1칸씩 그 정도를 보정하게 됩니다.
72
{{{#!if (ap>9)&&(ab.substr(ap-9,9)=="000000000")
66
}}}{{{#!if (ap>9)&&(ab.substr(ap-9,9)=="000000000")
7367
{{{#!if ab=ab.substr(0,ap-9), ap=ap-9
74
}}}}}}
75
{{{#!if (ap>4)&&(ab.substr(ap-4,4)=="0000")
68
}}}}}}{{{#!if (ap>4)&&(ab.substr(ap-4,4)=="0000")
7669
{{{#!if ab=ab.substr(0,ap-4), ap=ap-4
77
}}}}}}
78
{{{#!if (ap>2)&&(ab.substr(ap-2,2)=="00")
70
}}}}}}{{{#!if (ap>2)&&(ab.substr(ap-2,2)=="00")
7971
{{{#!if ab=ab.substr(0,ap-2), ap=ap-2
80
}}}}}}
81
{{{#!if (ap>2)&&(ab.substr(ap-2,2)=="00")
72
}}}}}}{{{#!if (ap>2)&&(ab.substr(ap-2,2)=="00")
8273
{{{#!if ab=ab.substr(0,ap-2), ap=ap-2
83
}}}}}}
84
{{{#!if (ap>1)&&(ab.substr(ap-1,1)=="0")
74
}}}}}}{{{#!if (ap>1)&&(ab.substr(ap-1,1)=="0")
8575
{{{#!if ab=ab.substr(0,ap-1), ap=ap-1
86
}}}}}}
87
{{{#!if (bp>9)&&(bb.substr(bp-9,9)=="000000000")
76
}}}}}}{{{#!if (bp>9)&&(bb.substr(bp-9,9)=="000000000")
8877
{{{#!if bb=bb.substr(0,bp-9), bp=bp-9
89
}}}}}}
90
{{{#!if (bp>4)&&(bb.substr(bp-4,4)=="0000")
78
}}}}}}{{{#!if (bp>4)&&(bb.substr(bp-4,4)=="0000")
9179
{{{#!if bb=bb.substr(0,bp-4), bp=bp-4
92
}}}}}}
93
{{{#!if (bp>2)&&(bb.substr(bp-2,2)=="00")
80
}}}}}}{{{#!if (bp>2)&&(bb.substr(bp-2,2)=="00")
9481
{{{#!if bb=bb.substr(0,bp-2), bp=bp-2
95
}}}}}}
96
{{{#!if (bp>2)&&(bb.substr(bp-2,2)=="00")
82
}}}}}}{{{#!if (bp>2)&&(bb.substr(bp-2,2)=="00")
9783
{{{#!if bb=bb.substr(0,bp-2), bp=bp-2
98
}}}}}}
99
{{{#!if (bp>1)&&(bb.substr(bp-1,1)=="0")
84
}}}}}}{{{#!if (bp>1)&&(bb.substr(bp-1,1)=="0")
10085
{{{#!if bb=bb.substr(0,bp-1), bp=bp-1
101
}}}}}}
102
103
그 다음 --앞자리에 0만 여러 개 적어놓고 장난치는 사람이 있을까봐-- au를 값으로 바꾼 다음 다시 문자열로 변환하여 앞자리에 있는 0들을 모두 삭제합니다. bu도 그렇게 둡니다.
104
{{{#!if au=+au, au=au.toString(), bu=+bu, bu=bu.toString()
105
}}}
106
107
이 상태의 au를 ma로 저장하고 ab가 빈 문자열이 아니라면 ab도 ma에 저장합니다. 같은 방법으로 bu, bb을 mb에 저장합니다.
108
{{{#!if ma=au, (ad!=-1)&&(ab!="")
109
a가 소수점 윗부분이 0이 되는 음수인 경우 "-0"으로 저장된 문자열은 정수값으로 바꿀 때 0이 되므로 ma앞에 -를 붙입니다.
86
}}}}}}{{{#!if au=+au, au=au.toString(), bu=+bu, bu=bu.toString()
87
}}}{{{#!if ma=au, (ad!=-1)&&(ab!="")
11088
{{{#!if ma+="."+ab, (+au==0)&&(as[0]==45)
11189
{{{#!if ma="-"+ma
112
}}}}}}}}}
113
{{{#!if mb=bu, (bd!=-1)&&(bb!="")
90
}}}}}}}}}{{{#!if mb=bu, (bd!=-1)&&(bb!="")
11491
{{{#!if mb+="."+bb, (+bu==0)&&(bs[0]==45)
11592
{{{#!if mb="-"+mb
11693
}}}}}}}}}
117
11894
##== 덧셈, 뺄셈 ==
119
덧셈과 뺄셈 계산과정을 적어봅니다.
12095
{{{#!if (f=="+")||(f=="-")
121
122
a과 b의 소수점 윗부분은 정수이므로 쉽게 계산할 수 있습니다.
12396
{{{#!if f=="+"
12497
{{{#!if ru=(+au)+(+bu)
125
}}}}}}
126
{{{#!if f=="-"
98
}}}}}}{{{#!if f=="-"
12799
{{{#!if ru=(+au)-(+bu)
128
}}}}}}
129
130
a와 b 모두가 정수이면 ap==0, bp==0이 되며, 이런 경우에는 소수점 아래 자릿수를 검산할 필요가 없습니다. a와 b 중 소수점 아래 자릿수가 있는 수가 있을 때에만 소수점 윗자리의 계산값이 얼마가 나오느냐를 보면서 소수점 아래의 자릿수를 정리하는 과정이 의미가 있습니다.
131
{{{#!if (ap>0)||(bp>0)
132
만약 소수점 아래를 계산한다면 자릿수를 똑같이 맞춰야 의미가 있으므로, 자릿수가 다른 경우 자릿수가 같게 만드는 과정을 먼저 거칩니다. 이를테면 a의 소수점 자릿수가 b의 소수점 자릿수보다 많으면 b뒤에 0을 더 추가하는 방식으로 변경합니다. b 자체가 정수여도 앞에 (소수점이 없을 경우) 이미 bb="", bp=0+0으로 초기화했으므로 동작될 것입니다.
133
소수점 아래 최대 18자리까지의 수를 취급하므로 최대 18칸 차이가 나게 됩니다.
134
ap>bp에서 ap-bp>0이 됩니다. ap-bp는 곧 ap가 bp보다 몇 칸만큼 더 많은지를 나타냅니다.
100
}}}}}}{{{#!if (ap>0)||(bp>0)
135101
{{{#!if ap>bp
136102
{{{#!if bp=ap, bb+=pd
137103
}}}{{{#!if bb=bb.substr(0,ap)
138
}}}}}}
139
140
반대로 b의 소수점 자릿수가 많은 경우도 있습니다.
141
{{{#!if bp>ap
104
}}}}}}{{{#!if bp>ap
142105
{{{#!if ap=bp, ab=ab+pd
143106
}}}{{{#!if ab=ab.substr(0,bp)
144
}}}}}}
145
146
위의 과정을 거치게 되면 소수점 아래 최대 자릿수를 똑같이 맞춘 상태에서 계산하게 되므로 ap==bp가 됩니다.
147
148
a가 음수인 경우 소수점 아래 값은 순 숫자만 표기된 상태이므로 양수 취급으로 되지 않게 소수점 아래 값인 ab에 음수 표기를 남깁니다.
149
{{{#!if as[0]==45
107
}}}}}}{{{#!if as[0]==45
150108
{{{#!if ab="-"+ab
151
}}}}}}
152
마찬가지로 b가 음수인 경우 b의 소수점 아래 값은 음수이므로 소수점 아래 값인 bb에 음수 표기를 남깁니다. 10을 소수점 아래 자릿수만큼 제곱한 값으로 저장합니다.
153
{{{#!if bs[0]==45
109
}}}}}}{{{#!if bs[0]==45
154110
{{{#!if bb="-"+bb
155
}}}}}}
156
157
이때 rb를 계산합니다.
158
{{{#!if f=="+"
111
}}}}}}{{{#!if f=="+"
159112
{{{#!if rb=(+ab)+(+bb)
160
}}}}}}
161
{{{#!if f=="-"
113
}}}}}}{{{#!if f=="-"
162114
{{{#!if rb=(+ab)-(+bb)
163
}}}}}}
164
165
소수점 아래끼리 더한 자릿수가 얼마나 되는지 보기 위해 rb를 문자열로 바꿉니다.
166
이 때 rb가 0이 아닐 경우에만 문자열로 변환합니다.
167
{{{#!if (+rb>0)||(+rb<0)
168
{{{#!if this.rb=rb.toString()
169
}}}
170
문자열로 rb의 길이를 rp로 정의합니다.
171
{{{#!if this.rp=rb.length
172
}}}
173
}}}
174
175
rb가 음수이면 rb의 첫번째(0번 index)의 문자열에는 마이너스(-)가 들어갑니다. 이 때는 rp를 rb의 마이너스 문자열을 세지 않은 자릿수가 되도록 앞에서 정의했던 rb.length에서 1만큼 줄여 정의합니다. ap, bp는 마이너스를 붙이기 전에 값이 고정되어 있으므로 rp처럼 줄일 필요가 없습니다.
176
{{{#!if rb[0]==45
115
}}}}}}{{{#!if (+rb>0)||(+rb<0)
116
{{{#!if rb=rb.toString(), rp=rb.length
117
}}}}}}{{{#!if rb[0]==45
177118
{{{#!if rp=rp-1
178
}}}}}}
179
180
ru값이 어떤지 보고 각 경우 rb값이 어떠한가에 따라 rb만 정리하거나 rb와 ru 모두 정리합니다.
181
중복 처리를 막기 위해 초기화된 ps 변수 하나를 가져옵니다.
182
183
소수점 아래 값의 부호와 소수점 위의 값의 부호가 서로 다른 경우 계산을 하기 위해 값을 하나 정의합니다.
184
185
{{{#!if tv=+(("1"+pd).substr(0,ap+1))
186
}}}
187
188
Case 1 : ru가 0보다 큰 경우
189
ru는 정수이므로 ru가 0보다 크면 곧 ru는 1 이상의 정수이며, 1 이상이면 a+b 또는 a-b가 양수+음수 꼴이 되더라도 소수점 아래 정리를 하면 됩니다. rb를 정리하는 과정에서 ru에서 1을 빌려오거나 ru에 1이 더해질 수도 있습니다. 앞에서 rb를 string으로 바꿨으므로 +rb를 다룹니다.
190
{{{#!if ru>0
191
Case 1-1 : rb가 0 이상인 경우
119
}}}}}}{{{#!if tv=+(("1"+pd).substr(0,ap+1))
120
}}}{{{#!if ru>0
192121
{{{#!if (+rb>=0)&&!ps
193
rb가 소수점 아래 자릿수를 초과하여 소수점 위의 수를 계산하게 생겼다면 ap=bp인 상황에서 rp>ap가 됩니다. rb는 첫 숫자가 1인 정수가 되므로 첫 숫자인 1을 삭제한 문자열로 정의합니다.
194122
{{{#!if rp>ap
195123
{{{#!if ru=ru+1, rb=rb.substr(1, rp-1)
196
}}}}}}
197
rb가 소수점 아래 자릿수를 초과하지 않을 경우 rb를 다시 정의할 필요 없이 그대로 둡니다.
198
{{{#!if rp<=ap
199
}}}
200
{{{#!if ps=true
201
}}}
202
}}}
203
204
Case 1-2 : rb가 음수인 경우 ru에서 1을 빌려옵니다. 1보다 작은 양수값에서 1보다 작은 양수값을 빼면 -1보다 작을 수 없으며, 소수점 아래 자릿수가 초과되지 않습니다.
205
{{{#!if (+rb<0)&&!ps
206
{{{#!if ru=ru-1
207
}}}
208
소수점 아래 자릿수인 ap만큼 10을 제곱한 값(tv)을 rb에서 증가시켜 rb를 재정의합니다. 그러면 rb는 양수가 됩니다. 그리고 rb를 다시 문자열로 변환합니다.
209
{{{#!if rb=tv+(+rb)
210
}}}{{{#!if rb=rb.toString()
211
}}}
212
{{{#!if ps=true
213
}}}}}}
214
정리과정을 끝냈으면 ru를 string으로 변환합니다.
215
{{{#!if this.ru=ru.toString()
216
}}}}}}
217
218
Case 2 : ru가 0인 경우 ru가 0이 되면 rb의 값이 양수인지 음수인지에 따라 달라집니다.
219
{{{#!if ru==0
220
Case 2-1 : rb가 0 이상인 경우
124
}}}}}}{{{#!if rp<=ap, ps=true
125
}}}}}}{{{#!if (+rb<0)&&!ps
126
{{{#!if ru=ru-1, rb=tv+(+rb), rb=rb.toString(), ps=true
127
}}}}}}{{{#!if this.ru=ru.toString()
128
}}}}}}{{{#!if ru==0
221129
{{{#!if (+rb>=0)&&!ps
222
rb가 양수이면서 rb가 자릿수를 초과한 경우 rb는 첫 숫자가 1인 정수가 되므로 첫 숫자인 1을 삭제한 문자열로 정의합니다.
223130
{{{#!if rp>ap
224131
{{{#!if ru=ru+1, rb=rb.substr(1, rp-1)
225
}}}}}}
226
ru를 string으로 변환합니다.
227
{{{#!if ru=ru.toString()
228
}}}
229
{{{#!if ps=true
230
}}}}}}
231
Case 2-2 : rb가 음수인 경우
232
{{{#!if (+rb<0)&&!ps
233
rb가 음수이면서 rb가 자릿수를 초과한 경우 값이 0인 ru에 1을 빼야 합니다. 그리고 rb가 "-"+숫자 꼴이므로 문자열의 1번 index에 해당하는 1을 지워야 합니다. 앞에서 rb가 음수인 경우 rp는 rb의 마이너스(-)가 차지하는 자릿수를 계산하지 않은 값 곧 숫자들이 차지하는 자릿수이므로, rb를 길이가 rp-1인 숫자들로 다시 정의합니다.
132
}}}}}}{{{#!if ru=ru.toString(), ps=true
133
}}}}}}{{{#!if (+rb<0)&&!ps
234134
{{{#!if rp>ap
235135
{{{#!if ru=ru-1, rb=rb.substr(2, rp-1)
236
}}}}}}
237
rb가 자릿수를 초과하지 않은 경우 rb에서 "-"를 뺀 문자열로 rb를 다시 정의합니다.
238
{{{#!if rp<=ap
136
}}}}}}{{{#!if rp<=ap
239137
{{{#!if rb=rb.substr(1, rp)
240
}}}}}}
241
ru를 string으로 변환합니다.
242
{{{#!if ru=ru.toString()
243
}}}
244
만일 -0.xxxx 같이 여전히 rb<0이고 ru==0인 상태라면 rb에 생겼던 마이너스 부호를 떼어내 왼쪽으로 붙입니다. ns를 "-"으로 바꿉니다.
245
{{{#!if +ru==0
138
}}}}}}{{{#!if ru=ru.toString()
139
}}}{{{#!if +ru==0
246140
{{{#!if ns="-"
247
}}}}}}
248
ru가 음수이면 ru앞에 음수 기호를 제거하고 ns에 "-"를 줍니다.
249
{{{#!if +ru<0
141
}}}}}}{{{#!if +ru<0
250142
{{{#!if ru=ru.substr(1), ns="-"
251
}}}}}}
252
{{{#!if ps=true
253
}}}}}}
254
}}}
255
256
Case 3 : ru가 0보다 작은 경우. 곧 -1 이하인 음수가 되는 경우.
257
{{{#!if ru<0
258
Case 3-1 : rb가 0 이하인 경우
143
}}}}}}{{{#!if ps=true
144
}}}}}}}}}{{{#!if ru<0
259145
{{{#!if (+rb<=0)&&!ps
260
rb가 음수이면서 자릿수를 초과한 경우 ru에 -1을 빼고, rb의 음수기호(-)와 첫번째 숫자인 문자열 "1"을 뺀 문자열로 rb를 다시 정의합니다.
261146
{{{#!if rp>ap
262147
{{{#!if rb=rb.substr(2, rp-1)
263
}}}
264
}}}
265
rb가 자릿수를 초과하지 않은 경우 rp는 음수기호를 제외한 숫자 자릿수이므로 rb를 음수기호만을 뺀 문자열로 다시 정의합니다. 단, rb가 0이 되면 rp==1이 되므로 rb==0인 경우는 제외합니다.
266
{{{#!if (rp<=ap)&&(+rb<0)
148
}}}}}}{{{#!if (rp<=ap)&&(+rb<0)
267149
{{{#!if rb=rb.substr(1, rp)
268150
}}}}}}{{{#!if ps=true
269
}}}}}}
270
Case 3-2 : rb가 0보다 큰 경우. 소수점 아래 부분을 보면 -1보다 큰 음수값에서 -1보다 큰 음수값을 빼면 1보다 클 수 없으며, 소수점 아래 자릿수가 초과되지 않습니다.
271
{{{#!if (+rb>0)&&!ps
272
ru<=-1이므로 ru+1를 해도 최대 0이 됩니다.
273
{{{#!if ru=ru+1
274
}}}
275
rb>0에서 rb은 음수(계산결과)의 음수(마이너스값이 줄어듦)이므로 rb의 자릿수인 rp만큼 10을 제곱한 값(tv)에서 rb을 '''뺀''' 값으로 rb를 재정의합니다. 그러면 rb는 양수이지만 계산결과인 음수에 맞춘 값이 됩니다. 그리고 rb를 다시 문자열로 변환합니다. 변환합니다.
276
{{{#!if rb=tv-(+rb)
277
}}}{{{#!if rb=rb.toString()
278
}}}{{{#!if ps=true
279
}}}}}}
280
정리과정을 끝냈으면 ru를 string으로 변환합니다.
281
{{{#!if this.ru=ru.toString()
282
}}}
283
-0.xxxx 같이 (ru==0인데) 연산결과가 -1보다 큰 음수로 나오는 경우가 있으므로 ru 앞에 음수 기호를 제거하고 ns에 "-"를 줍니다.
284
{{{#!if +ru<0
151
}}}}}}{{{#!if (+rb>0)&&!ps
152
{{{#!if ru=ru+1, rb=tv-(+rb), rb=rb.toString(), ps=true
153
}}}}}}{{{#!if this.ru=ru.toString()
154
}}}{{{#!if +ru<0
285155
{{{#!if ru=ru.substr(1), ns="-"
286
}}}}}}
287
{{{#!if +ru==0
156
}}}}}}{{{#!if +ru==0
288157
{{{#!if ns="-"
289
}}}}}}
290
}}}
291
여기까지가 소수점 아래 자릿수 숫자들의 계산과정입니다.
292
}}}
293
294
a와 b 모두 정수인 경우 ap, bp는 모두 0이 되므로 ru만을 그대로 문자열로 바꾸면 되며 소수점 아래(rb)는 표기해야 할 필요가 없으므로 rb="", (소수점 아래 자릿수)rp=0을 반환합니다.
295
{{{#!if (ap==0)&&(bp==0)
158
}}}}}}}}}}}}{{{#!if (ap==0)&&(bp==0)
296159
{{{#!if this.ru=ru.toString(), rb="", rp=0+0
297
}}}}}}
298
299
rb==0인 경우 rb="", rp=0을 반환합니다.
300
{{{#!if +rb==0
160
}}}}}}{{{#!if +rb==0
301161
{{{#!if rb="", rp=0+0
302
}}}}}}
303
304
이제 rb=""이 아닌 경우 소수점 아래 숫자 정리를 합니다.
305
rp를 rb의 문자열 길이로 다시 정의합니다.
306
{{{#!if rb!=""
162
}}}}}}{{{#!if rb!=""
307163
{{{#!if this.rp=rb.length
308
}}}
309
310
+"000100"을 숫자로 바꾸면 100이 되는 문제가 있습니다. 이처럼 소수점 아래 자릿수를 연산한 결과를 문자열로 바꿨을 때 기존 소수점 아래 자릿수보다 작은 길이가 나오면 앞쪽에 0을 보충합니다.
311
앞에서 ap,bp를 똑같이 맞췄으므로 ap를 가져옵니다. 자릿수가 모자랄 경우 0을 하나씩 보충합니다.
312
{{{#!if rp<ap
164
}}}{{{#!if rp<ap
313165
{{{#!if rb=pd.substr(0,ap-rp)+rb
314
}}}}}}
315
316
앞에 0을 채웠다면 이제, 소수점 아래로 나오는 숫자를 보고 마지막에서부터 0이 나오면 한 자리씩 지우는 과정을 시작합니다.
317
318
여기까지가 덧셈 또는 뺄셈연산의 계산과정이며 과정은 이후 rb 정리 과정으로 넘어갑니다.
319
}}}}}}
320
166
}}}}}}}}}}}}
321167
##== 곱셈 & 나눗셈 ==
322168
##=== 숫자 초기화 ===
323169
{{{#!if (f=="*")||(f=="/")
......