r80 vs r81
......
5555
5656
덧셈과 뺄셈 계산과정을 적어봅니다.
5757
{{{#!if (f=="+")||(f=="-")
58
소수점 아래를 계산하면 자릿수를 똑같이 맞춰야 의미가 있으므로, 자릿수가 다른 경우 자릿수가 같게 만드는 과정을 먼저 거칩니다.
58
59
a과 b의 소수점 윗부분은 정수이므로 쉽게 계산할 수 있습니다.
60
{{{#!if f=="+"
61
{{{#!if ru=(+au)+(+bu)
62
}}}}}}
63
{{{#!if f=="-"
64
{{{#!if ru=(+au)-(+bu)
65
}}}}}}
66
67
a와 b 모두가 정수이면 ad=a.indexOf("."), bd=b.indexOf(".") 모두 -1이고 ap==0, bp==0이 되며, 이런 경우에는 소수점 아래 자릿수검산할 필요가 없습니다. a와 b 중 소수점 아래 자릿수가 있는 수가 있을 때에만 소수점 윗자리의 계산값이 얼마가 나오느냐를 보면서 소수점 아래의 자릿수를 정리는 과정이 의미가 있습니다.
68
{{{#!if (ap>0)||(bp>0)
69
만약 소수점 아래를 계산한다면 자릿수를 똑같이 맞춰야 의미가 있으므로, 자릿수가 다른 경우 자릿수가 같게 만드는 과정을 먼저 거칩니다.
5970
{{{#!if ap>bp
6071
이를테면 a의 소수점 자릿수가 b의 소수점 자릿수보다 많으면 b뒤에 0을 더 추가하는 방식으로 변경합니다. b 자체가 정수여도 앞에 (소수점이 없을 경우) 이미 bb="", bp=0+0으로 초기화했으므로 동작될 것입니다.
6172
{{{#!if bp+=1, bb=bb+"0"
......
140151
}}}}}}{{{#!if bp>ap
141152
{{{#!if ap+=1, ab=ab+"0"
142153
}}}}}}
143
}}}
144154
위의 과정을 거치게 되면 소수점 아래 최대 자릿수를 똑같이 맞춘 상태에서 계산하게 되므로 ap==bp가 됩니다.
145155
146156
a가 음수인 경우 소수점 아래 값은 순 숫자만 표기된 상태이므로 양수 취급으로 되지 않게 소수점 아래 값인 ab에 음수 표기를 남깁니다.
......
152162
{{{#!if bb="-"+bb
153163
}}}}}}
154164
165
이때 rb를 계산합니다.
155166
{{{#!if f=="+"
156
{{{#!if ru=(+au)+(+bu), rb=(+ab)+(+bb)
167
{{{#!if rb=(+ab)+(+bb)
157168
}}}}}}
158169
{{{#!if f=="-"
159
뺄셈은 덧셈의 역연산이고 구조가 단순하므로 덧셈과 뺄셈을 먼저 같이 처리합니다. ru, rb는 각각 정수 값으로 나올 것입니다.
160
{{{#!if ru=(+au)-(+bu), rb=(+ab)-(+bb)
170
{{{#!if rb=(+ab)-(+bb)
161171
}}}}}}
162172
163
{{{#!if (f=="+")||(f=="-")
164
덧셈 또는 뺄셈 연산으로 나온 값을 정리합니다.
165
166173
소수점 아래끼리 더한 자릿수가 얼마나 되는지 보기 위해 rb를 문자열로 바꿉니다.
167174
{{{#!if this.rb=rb.toString()
168175
}}}
......
218225
}}}}}}
219226
rb가 자릿수를 초과하지 않은 경우 rb에서 "-"를 뺀 문자열로 rb를 다시 정의합니다.
220227
{{{#if rp==ap
221
{{{#!if rb=rb.substr(1, rp-1)
228
{{{#!if rb=rb.substr(1, rp)
222229
}}}}}}}}}
223230
정리과정을 끝냈으면 ru를 string으로 변환합니다.
224231
{{{#!if this.ru=ru.toString()
......
232239
233240
Case 3 : ru가 0보다 작은 경우. 곧 -1 이하인 음수가 되는 경우.
234241
{{{#!if ru<0
242
Case 3-1 : rb가 0 이하인 경우
243
{{{#!if +rb<=0
244
rb가 음수이면서 자릿수를 초과한 경우 ru에 -1을 빼고, rb의 음수기호(-)와 첫번째 숫자인 문자열 "1"을 뺀 문자열로 rb를 다시 정의합니다.
245
{{{#!if rp>ap
246
{{{#!if rb=rb.substr(2, rp-1)}}}
235247
}}}
248
rb가 자릿수를 초과하지 않은 경우 음수기호만을 뺀 문자열로 다시 정의합니다. 단, rb가 0이 되면 rp==1이 되므로 rb==0인 경우는 제외합니다.
249
{{{#!if (rp==ap)&&(+rb<0)
250
{{{#!if rb=rb.substr(1, rp-1)
251
}}}}}}}}}
252
Case 3-2 : rb가 0보다 큰 경우
253
{{{#!if +rb>0
254
236255
}}}
256
정리과정을 끝냈으면 ru를 string으로 변환합니다.
257
{{{#!if this.ru=ru.toString()
258
}}}
259
-0.xxxx 같이 (ru==0인데) 연산결과가 -1보다 큰 음수로 나오는 경우가 된다면 ru 문자열 앞에 "-"를 붙입니다.
260
{{{#!if +ru==0
261
{{{#!if ru="-"+ru
262
}}}}}}
263
}}}
264
여기까지가 소수점 아래 자릿수 숫자들의 계산과정입니다.
265
}}}
237266
267
여기까지가 덧셈 또는 뺄셈연산의 계산과정입니다.
268
}}}
269
238270
{{{#!if f=="*"
239271
18자리 숫자로 입력할 수 있는 최대 정수는 999,999,999,999,999,999입니다.
240272
다행히 999,999,999,999,999,999*9=8,999,999,999,999,999,991 < long 한계치 9,223,372,036,854,775,807 이라서 a*각 자릿수로 덧셈해볼 수는 있습니다.
......