| r80 vs r81 | ||
|---|---|---|
| ... | ... | |
| 55 | 55 | |
| 56 | 56 | 덧셈과 뺄셈 계산과정을 적어봅니다. |
| 57 | 57 | {{{#!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 | 만약 소수점 아래를 계산한다면 자릿수를 똑같이 맞춰야 의미가 있으므로, 자릿수가 다른 경우 자릿수가 같게 만드는 과정을 먼저 거칩니다. | |
| 59 | 70 | {{{#!if ap>bp |
| 60 | 71 | 이를테면 a의 소수점 자릿수가 b의 소수점 자릿수보다 많으면 b뒤에 0을 더 추가하는 방식으로 변경합니다. b 자체가 정수여도 앞에 (소수점이 없을 경우) 이미 bb="", bp=0+0으로 초기화했으므로 동작될 것입니다. |
| 61 | 72 | {{{#!if bp+=1, bb=bb+"0" |
| ... | ... | |
| 140 | 151 | }}}}}}{{{#!if bp>ap |
| 141 | 152 | {{{#!if ap+=1, ab=ab+"0" |
| 142 | 153 | }}}}}} |
| 143 | }}} | |
| 144 | 154 | 위의 과정을 거치게 되면 소수점 아래 최대 자릿수를 똑같이 맞춘 상태에서 계산하게 되므로 ap==bp가 됩니다. |
| 145 | 155 | |
| 146 | 156 | a가 음수인 경우 소수점 아래 값은 순 숫자만 표기된 상태이므로 양수 취급으로 되지 않게 소수점 아래 값인 ab에 음수 표기를 남깁니다. |
| ... | ... | |
| 152 | 162 | {{{#!if bb="-"+bb |
| 153 | 163 | }}}}}} |
| 154 | 164 | |
| 165 | 이때 rb를 계산합니다. | |
| 155 | 166 | {{{#!if f=="+" |
| 156 | {{{#!if r | |
| 167 | {{{#!if rb=(+ab)+(+bb) | |
| 157 | 168 | }}}}}} |
| 158 | 169 | {{{#!if f=="-" |
| 159 | ||
| 160 | {{{#!if r | |
| 170 | {{{#!if rb=(+ab)-(+bb) | |
| 161 | 171 | }}}}}} |
| 162 | 172 | |
| 163 | {{{#!if (f=="+")||(f=="-") | |
| 164 | 덧셈 또는 뺄셈 연산으로 나온 값을 정리합니다. | |
| 165 | ||
| 166 | 173 | 소수점 아래끼리 더한 자릿수가 얼마나 되는지 보기 위해 rb를 문자열로 바꿉니다. |
| 167 | 174 | {{{#!if this.rb=rb.toString() |
| 168 | 175 | }}} |
| ... | ... | |
| 218 | 225 | }}}}}} |
| 219 | 226 | rb가 자릿수를 초과하지 않은 경우 rb에서 "-"를 뺀 문자열로 rb를 다시 정의합니다. |
| 220 | 227 | {{{#if rp==ap |
| 221 | {{{#!if rb=rb.substr(1, rp | |
| 228 | {{{#!if rb=rb.substr(1, rp) | |
| 222 | 229 | }}}}}}}}} |
| 223 | 230 | 정리과정을 끝냈으면 ru를 string으로 변환합니다. |
| 224 | 231 | {{{#!if this.ru=ru.toString() |
| ... | ... | |
| 232 | 239 | |
| 233 | 240 | Case 3 : ru가 0보다 작은 경우. 곧 -1 이하인 음수가 되는 경우. |
| 234 | 241 | {{{#!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)}}} | |
| 235 | 247 | }}} |
| 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 | ||
| 236 | 255 | }}} |
| 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 | }}} | |
| 237 | 266 | |
| 267 | 여기까지가 덧셈 또는 뺄셈연산의 계산과정입니다. | |
| 268 | }}} | |
| 269 | ||
| 238 | 270 | {{{#!if f=="*" |
| 239 | 271 | 18자리 숫자로 입력할 수 있는 최대 정수는 999,999,999,999,999,999입니다. |
| 240 | 272 | 다행히 999,999,999,999,999,999*9=8,999,999,999,999,999,991 < long 한계치 9,223,372,036,854,775,807 이라서 a*각 자릿수로 덧셈해볼 수는 있습니다. |
| ... | ... |