| r77 vs r78 | ||
|---|---|---|
| ... | ... | |
| 10 | 10 | '''ab''' : "a" below value (string→integer); '''bb''' : "b" below value (string→integer); |
| 11 | 11 | '''ap''' : "a" # of places of decimal (integer); '''bp''' : "b" # of places of decimal (integer); |
| 12 | 12 | 0.303과 0.0303은 다른 수이므로 자리수가 다름을 표시할 용도 |
| 13 | '''ru''' : "result" upper value (integer→string); '''rb''' : "result" below value (integer→string); | |
| 13 | '''ru''' : "result" upper value (integer→string); '''rb''' : "result" below value (integer→string); | |
| 14 | '''rp''' : "result" # of places of decimal (integer); | |
| 14 | 15 | {{{#!if this.as=a.toString(), this.bs=b.toString(), this.ru=0+0, this.rb=0+0 |
| 15 | 16 | }}}{{{#!if this.al=as.length, this.bl=bs.length, this.ad=as.indexOf("."), this.bd=bs.indexOf(".") |
| 16 | 17 | }}}{{{#!if ad!=-1 |
| ... | ... | |
| 164 | 165 | 문자열로 된 rb의 길이를 rp로 정의합니다. |
| 165 | 166 | {{{#!if this.rp=rb.length |
| 166 | 167 | }}} |
| 167 | rb가 음수이면 rp를 | |
| 168 | rb가 음수이면 rb의 첫번째(0번 index)의 문자열에는 마이너스(-)가 들어갑니다. 이 때는 rp를 rb의 마이너스 문자열을 세지 않은 자릿수가 되도록 앞에서 정의했던 rb.length에서 1만큼 줄여 정의합니다. ap, bp는 마이너스를 붙이기 전에 값이 고정되어 있으므로 rp처럼 줄일 필요가 없습니다. | |
| 168 | 169 | {{{#!if rb[0]==45 |
| 169 | 170 | {{{#!if rp=rp-1 |
| 170 | 171 | }}}}}} |
| ... | ... | |
| 172 | 173 | ru는 정수이므로 ru가 0보다 크면 곧 ru는 1 이상의 정수이며, 1 이상이면 a+b 또는 a-b가 양수+음수 꼴이 되더라도 소수점 아래 정리를 하면 됩니다. rb를 정리하는 과정에서 ru에서 1을 빌려오거나 ru에 1이 더해질 수도 있습니다. 앞에서 rb를 string으로 바꿨으므로 +rb를 다룹니다. |
| 173 | 174 | {{{#!if ru>0 |
| 174 | 175 | {{{#!if +rb>=0 |
| 175 | rb가 자릿수를 초과 | |
| 176 | rb가 소수점 아래 자릿수를 초과하여 소수점 위의 수를 계산하게 생겼다면 ap=bp인 상황에서 rp>ap가 됩니다. rb는 첫 숫자가 1인 정수가 되므로 첫 숫자인 1을 삭제한 문자열로 정의합니다. | |
| 176 | 177 | {{{#!if rp>ap |
| 177 | 178 | {{{#!if ru=ru+1, rb=rb.substr(1, rp-1) |
| 178 | 179 | }}}}}} |
| 179 | rb가 자릿수를 초과하지 않을 경우 rb를 다시 정의할 필요 없이 그대로 둡니다. | |
| 180 | rb가 소수점 아래 자릿수를 초과하지 않을 경우 rb를 다시 정의할 필요 없이 그대로 둡니다. | |
| 180 | 181 | {{{#!if rp<=ap |
| 181 | 182 | }}} |
| 183 | }}} | |
| 184 | ||
| 185 | rb가 음수가 되는 경우 ru에서 1을 빌려옵니다. 1보다 작은 값에서 1보다 작은 값을 빼므로 -1보다 작을 수 없으며, 소수점 아래 자릿수가 초과되지 않습니다. | |
| 186 | {{{#!if +rb<0 | |
| 187 | {{{#!if ru=ru-1 | |
| 188 | }}} | |
| 189 | rb의 자릿수인 rp만큼 10을 제곱한 값으로 rb를 재정의한 다음 rb를 다시 문자열로 변환합니다. | |
| 190 | {{{#!if rb=(+rb)+10**rp | |
| 191 | }}}{{{#!if rb=rb.toString() | |
| 192 | }}} | |
| 193 | }}} | |
| 194 | 정리과정을 끝냈으면 ru를 string으로 변환합니다. | |
| 195 | {{{#!if this.ru=ru.toString() | |
| 182 | 196 | }}}}}} |
| 183 | 197 | |
| 198 | ru가 0이 되면 rb의 값이 양수인지 음수인지에 따라 달라집니다. | |
| 184 | 199 | {{{#!if ru==0 |
| 200 | {{{#!if +rb>=0 | |
| 201 | rb가 양수이면서 rb가 자릿수를 초과한 경우 rb는 첫 숫자가 1인 정수가 되므로 첫 숫자인 1을 삭제한 문자열로 정의합니다. | |
| 202 | {{{#!if rp>ap | |
| 203 | {{{#!if ru=ru+1, rb=rb.substr(1, rp-1) | |
| 204 | }}}}}}}}} | |
| 205 | rb가 음수인 경우 | |
| 206 | {{{#!if +rb<0 | |
| 207 | rb가 음수이면서 rb가 자릿수를 초과한 경우 값이 0인 ru에 1을 빼야 합니다. 그리고 rb가 "-"+숫자 꼴이므로 문자열의 1번 index에 해당하는 1을 지워야 합니다. 앞에서 rb가 음수인 경우 rp는 rb의 마이너스(-)가 차지하는 자릿수를 계산하지 않은 값 곧 숫자들이 차지하는 자릿수이므로 substr에서 문자열 길이를 rp-1로 둡니다. | |
| 208 | {{{#!if rp>ap | |
| 209 | {{{#!if ru=ru-1, rb="-"+rb.substr(2, rp-1) | |
| 210 | }}}}}}}}} | |
| 211 | ||
| 212 | 정리과정을 끝냈으면 ru를 string으로 변환합니다. | |
| 213 | {{{#!if this.ru=ru.toString() | |
| 185 | 214 | }}} |
| 215 | }}} | |
| 216 | }}} | |
| 186 | 217 | {{{#!if ru<0 |
| 187 | 218 | }}} |
| 188 | 219 | |
| 189 | 220 | |
| 221 | ||
| 190 | 222 | {{{#!if f=="*" |
| 191 | 223 | 18자리 숫자로 입력할 수 있는 최대 정수는 999,999,999,999,999,999입니다. |
| 192 | 224 | 다행히 999,999,999,999,999,999*9=8,999,999,999,999,999,991 < long 한계치 9,223,372,036,854,775,807 이라서 a*각 자릿수로 덧셈해볼 수는 있습니다. |
| ... | ... |