GITHUB
부동소수점 해결 방법
BLOGProject
Seohyun
Develop
12 Oct 2022
부동소수점 해결 방법

JavaScript 부동소수점

이전 글에서 부동소수점을 자세히 살펴보았습니다. 다시 한번 간단히 정리해보고 이제 부동소수점을 처리해보는 해결방법을 알아보도록 하겠습니다.

JavaScript에서 숫자는 64비트 IEEE-754 형식으로 다룹니다. 우리가 현재 사용하는 10진법으로 표현된 수를 2진법으로 변환할 때 64비트를 초과하는 무한 소수가 발생합니다. IEEE-754에서는 가능한 가장 가까운 숫자로 반올림하는 방법을 사용해 무한 소수가 생기는 문제를 해결합니다. 그런데 반올림 규칙을 적용하면 이 때 발생하는 ‘작은 정밀도 손실’을 우리가 볼 수는 없지만 실제로 손실은 발생합니다.

안전한 최대 정수값?

여기서 ‘안전함’이란 정수를 정확하고 올바르게 표현할 수 있다는 것을 의미합니다. JavaScript의 IEEE-754에 기술된 배정밀도 부동소숫점 형식 숫자체계로 인해 -(2^53-1)과 2^53-1 사이의 수만 안전하게 표현할 수 있습니다. 즉 범위는 -9,007,199,254,740,991 ~ 9,007,199,254,740,991(약 9000조)입니다.

부동소수점 해결해봅시다

라이브러리

부동소수점의 오차를 해결하고 사람들이 쓰는 10진법으로 오차없이 정확히 수를 표현하기 위해 라이브러리를 도입할 수 있습니다. big.js, bigdecimal.js, bignumber.js, decimal.js, math.js와 같은 많은 라이브러리들이 있습니다. 각각의 라이브러리들이 제공하는 연산이 다르므로 잘 참고해서 필요한 라이브러리를 적용하는 게 좋겠습니다.

라이브러리 비교

부동소수점 오차를 해결해야하는 개발 중인 서비스는 현재 국내에서 운영중이지만 곧 국제화가 계획 중이고, 실제 해외에도 운영될 서비스였습니다. 따라서 통화의 단위에 소수점이 있는 경우도 있어 정밀하게 10진법으로 변환해주는 라이브러리를 조사했고 후보는 big.js, decimal.js, decimal.js-light가 있었습니다.

통화의 단위, 무게의 단위가 소수점에 반영되어 정밀한 라이브러리를 찾는 것이 목표지만, 그 외에도 고려해야할 사항은 라이브러리의 용량이 적고, 이왕이면 많은 이용자가 있어 버그들이 더 많이 수정된 안정적인 라이브러리였으면 좋겠다는 점이 있었습니다. 따라서 https://npmtrends.com/ 에서 big.js, decimal.js, decimal.js-light를 비교해 보았습니다.



image



다운로드 횟수가 big.js > decimal.js > decimal.js-light.js 순으로 big.js의 다운로드 횟수가 가장 높습니다. 용량은 big.js 라이브러리가 가장 적었으며, 가장 최근까지 업데이트된 라이브러리는 decimal.js였습니다.



big.jsdecimal.jsdecimal.js-light
Weekly Downloads16,125,38711,876,226870,740
Unpacked Size58.6 kB283 kB218 kB
Last publish@2022년 7월 10일@2022년 9월 17일@2020년 10월 1일


해결 방안

문제를 해결하기 전, 요구사항은 소수점 몇째 자리까지 표현이 정확한지, 이러한 소수점이 포함된 숫자를 연산할 때 몇 자리까지 정밀하게 표현할 수 있는지였습니다. 일단 구체적으로 정해진 사항이 없어 다양한 방법으로 소수점의 오차를 파악해보고 어떤 해결방법이 좋을지 추후 판단해 서비스에 적용하기로 했습니다.

이에 따라 계산기, JavaScript에서 아무 처리없이 계산하는 방법을 대조군으로 조사하였습니다. 실험군으로는 10의 n제곱을 곱해 소수점을 정수로 변환해 연산 후 마지막에 10의 n제곱을 나눠 소수 부분을 표현하는 방법(이하 자체 해결 방법), big.js 라이브러리를 사용하는 방법, decimal.js-light 라이브러리를 사용하는 방법으로 나누어 test case를 조사해 비교해 보았습니다.

자체 해결

이 해결방법은 라이브러리 없이 해결하는 방법으로 연산하기 전 실수를 정수화한 후 이후 소수점으로 다시 표현하는 방법입니다.

1. 소수점 제거

소수점이 있는 숫자에 10의 거듭제곱을 곱해 우선적으로 소수점 제거합니다. 이는 부동소수점의 정밀도 손실 최소화하기 위함입니다.

2. 원래대로 소수점 포현

모든 연산이 끝난 후 소수점을 제거하기 위해 곱했던 10의 거듭제곱으로 나눠 원래 결과값으로 변환합니다.

3. toFixed()

그래도 존재할 수 있는 부동소수점의 오차를 toFixed를 통해 어림수로 반환합니다. 1번에서 10의 거듭제곱을 곱해 소수점을 없애 주었던 이유와 동일합니다. 1번에서 보정해주었음에도 존재할 수 있는 부동소수점으로 인한 오차를 한 번 더 안전하게 보정해 주기 위함으로 toFixed를 적용했습니다.

toFixed();
toFixed(n);
toFixed(1);
toFixed();
toFixed(1);

toFixed()의 사용법입니다. String type으로 반환합니다. 소수점 n번째 수까지의 어림수를 구합니다.

default는 ‘0’으로 정수로 반환합니다.

이 경우 소수점 첫째 자리까지 표현해 반환해줍니다.

Code

test case를 어떻게 처리하였는지 이제 code를 살펴보겠습니다.

function fnItself(a, sign, b) {
if (sign === "+") {
return (a * 100 + b * 100) / 100;
}
if (sign === "-") {
return (a * 100 - b * 100) / 100;
}
if (sign === "*") {
return Math.round((a * 100 * (b * 100)) / 10000).toFixed();
return (a * 100 * (b * 100)) / 10000;
}
if (sign === "/") {
return (a * 100) / (b * 100) / 10000;
}
}
return Math.round((a * 100 * (b * 100)) / 10000).toFixed();
return ((a * 100) / (b * 100) / 10000).toFixed(1);
return ((a * 100 * (b * 100)) / 10000).toFixed(2);
return ((a * 100) / (b * 100) / 10000).toFixed(1);
return ((a * 100 * (b * 100)) / 10000).toFixed(2);

자체 해결하는 방법으로 test case의 결과를 소수점 전부 표현한 경우입니다. 매개변수(Parameter)로 숫자인 a, b를 받고, sign으로 연산을 비교한 후 계산을 실행합니다.

자체 해결하는 방법으로 test case의 결과를 toFixed() 메서드를 이용해 정수로 표현합니다.

자체 해결하는 방법으로 toFixed(1)로 소수점 첫째 자리까지 표현합니다.

마찬가지로 자체 해결하는 방법으로 소수점 둘째 자리까지 표현합니다.


big.js

big.js 라이브러리는 10진법 기반의 연산 라이브러리이며, 가장 용량이 가볍고 다운로드 횟수가 높은 라이브러리입니다. big.js는 소수점 이하 자릿수로 지정된 정밀도를 적용하고 나눗셈에만 정밀도 적용하는 특징이 있습니다.

방법

new Big(n) 생성자를 이용해 big.js의 내장 객체 타입의 인스턴스를 생성하여 연산합니다. n의 type은 number 또는 string 또는 Big object입니다. 따라서 toString으로 String type으로 변환합니다. 소수점의 표현은 round() 메서드를 이용했습니다.



Code

const result = new Big(item.quantity).times(item.unitPrice);

new Big() 생성자를 통해 수량(item.quantity)를 생성하고 times() 메서드를 통해 단가(item.unitPrice)를 곱해줍니다.

function fnBigjs(a, sign, b) {
const numberA = new Big(a);
const numberB = new Big(b);
if (sign === "+") {
return numberA.plus(numberB).toString();
}
if (sign === "-") {
return numberA.minus(numberB).round().toString();
return numberA.minus(numberB).toString();
}
if (sign === "*") {
return numberA.times(numberB).toString();
}
if (sign === "/") {
return numberA.div(numberB).toString();
}
}
return numberA.minus(numberB).round(1).toString();
return numberA.minus(numberB).round().toString();
return numberA.minus(numberB).round(2).toString();
return numberA.minus(numberB).round(1).toString();
return numberA.minus(numberB).round(2).toString();

big.js 라이브러리를 이용해 연산하되 소수점을 전부 표현하는 방법입니다. 매개변수(Parameter)로 받은 숫자(a, b)를 sign으로 받은 연산을 통해 해당하는 연산을 한 후 String 타입으로 변환합니다.

big.js 라이브러리를 통해 연산 후 round() 메서드를 통해 반올림하여 정수로 표현해 준 뒤 String 타입으로 변환합니다.

big.js 라이브러리로 연산하고 round(1)로 소수점 첫째 자리까지 표현 후 String으로 형변환합니다.

big.js 라이브러리로 연산하고 round(2)로 소수점 둘째 자리까지 표현 후 String으로 형변환합니다.


decimal.js-light

decimal.js-light 라이브러리 10진법 기반의 연산 라이브러리로 decimal.js 라이브러리의 가벼운 버전입니다. 매우 작거나 큰 값을 보다 효율적으로 처리하고, big.js 보다 높은 기준에 값을 저장 하므로 자릿수가 많은 값에 대한 작업을 수행할 때 속도 더 빠릅니다. 정밀도가 소수 자릿수 대신 decimal.js-light의 유효 숫자로 지정합니다.


방법

new Decimal(1).times(2).toPrecision().toString();

생성자인 new Decimal을 통해 만든 수 ‘1’을 times() 메서드를 통해 ‘2’를 곱하는 연산을 한 후 toPrecision() 메서드를 이용해 정밀하게 표현한 후 toString으로 String으로 형변환합니다.


toPrecision()

new Decimal(12.3).toPrecision(5); // '12.300'

string으로 반환하며, 유효 자릿수로 반올림합니다. Big 숫자 값의 자릿수가 지정된 것보다 적은 경우 반환 값에 ‘0’이 추가되어 반환합니다.

function fnDecimaljs(a, sign, b) {
const numberA = new Decimal(a);
const numberB = new Decimal(b);
if (sign === "+") {
return numberA.plus(numberB).toString();
}
if (sign === "-") {
return numberA.minus(numberB).toInteger().toString();
return numberA.minus(numberB).toString();
}
if (sign === "*") {
return numberA.times(numberB).toString();
}
if (sign === "/") {
return numberA.div(numberB).toString();
}
}
return numberA.minus(numberB).toFixed(1).toString();
return numberA.minus(numberB).toInteger().toString();
return numberA.minus(numberB).toFixed(2).toString();
return numberA.minus(numberB).toFixed(1).toString();
return numberA.minus(numberB).toFixed(2).toString();

new Decimal을 통해 생성한 수를 plus(), minus(), times(), div()를 통해 연산하고 소수점 부분에 대한 별도의 처리없이 소수점을 전부 표현합니다.

decimal.js를 통해 숫자를 연산한 후 toInteger() 메서드를 이용해 정수로 변환한 후 String으로 형변환합니다.

decimal.js 라이브러리로 숫자를 연산한 후 toFixed() 메서드를 이용해 소수점 첫째 자리까지 나타냅니다.

decimal.js를 통해 연산 후 소수점 둘째 자리까지 표현합니다.

test

계산기 결과, JavaScript에서 아무 처리없이 계산한 경우는 대조군으로 실험군의 비교를 용이하게 하기위해 함께 조사하였습니다. 계산기 결과를 기준으로 할 것이므로 파란색으로 표현하였고, 계산기와 틀린 결과는 빨간색으로 표현 하였습니다.

각각의 조사는 연산 결과로 소수점을 모두 표현하는 경우, 소수점 첫째자리까지 표현하는 경우, 소수점 둘째자리까지 표현한 경우, 정수로 표현하는 경우입니다.


a. test case - 소수 전부 표현

숫자 단위계산식계산기js자체 해결big.jsdecimal.js-light
0.1+0.2
0.3
0.30000000000000004
0.30.30.3
0.28*14
3.92
3.9200000000000004
3.923.923.92
0.1*87
8.7
8.700000000000001
8.78.78.7
백억4674.569*7474757
34,941,267,354.733
34941267354.73334941267354.73334941267354.73334941267354.733
767565.568*6775675
5,200,774,829,958.4
5200774829958.399
5200774829958.45200774829958.45200774829958.4
천만239281.121*244
58,384,593.524
58384593.524000004
58384593.52458384593.52458384593.524
천억498581.244*751411
374,639,431,135.284
374639431135.284374639431135.284374639431135.284374639431135.284
234.234*23
5,387.382
5387.3820000000005
5387.3825387.3825387.382
백만4533.1*355
1,609,250.5
1609250.5000000002
1609250.51609250.51609250.5
천만345313.877*49
16,920,379.973
16920379.972999997
16920379.97316920379.97316920379.973
십억37485.34*34777
1,303,627,669.18
1303627669.1799998
1303627669.181303627669.181303627669.18
2421.55*64529
156,260,199.95
156260199.95000002
156260199.95156260199.95156260199.95
백만87291.127*20
1,745,822.54
1745822.5399999998
1745822.541745822.541745822.54
천만93971.589*729
68,505,288.381
68505288.38100001
68505288.38168505288.38168505288.381
백만8291.798*522
4,328,318.556
4328318.556000001
4328318.556000001
4328318.5564328318.556
십억727191.32*2801423
2,037,170,489,248.36
2037170489248.3599
2037170489248.3599
2037170489248.362037170489248.36
십억8381.1*919209
7,703,982,549.9
7703982549.900001
7703982549.97703982549.97703982549.9
십억920123.977*2918
2,684,921,764.886
2684921764.8859997
2684921764.8862684921764.8862684921764.886
천억92384.618*4914731
454,045,546,007.758
454045546007.758454045546007.758454045546007.758454045546007.758
십억2919723.996*999
2,916,804,272.004
2916804272.0039997
2916804272.0042916804272.0042916804272.004
십억819842.376*1929
1,581,475,943.304
1581475943.3040001
1581475943.3041581475943.3041581475943.304
백억828394.348*46134
38,217,144,850.632
38217144850.631996
38217144850.63238217144850.63238217144850.632
천만28012.129*2394
67,061,036.826
67061036.826000005
67061036.82667061036.82667061036.826
81923.188*1920
157,292,520.96
157292520.95999998
157292520.96157292520.96157292520.96
238129.219*2989
711,768,235.591
711768235.5910001
711768235.591711768235.591711768235.591
십억951947.349*1838
1,749,679,227.462
1749679227.4620001
1749679227.4621749679227.4621749679227.462
천억4737123.001*92389
437,658,056,939.389
437658056939.38904
437658056939.389437658056939.389437658056939.389
천조567567.568*5675567657
3,221,268,132,102,948.176
3221268132102948
3221268132102948.53221268132102948.1763221268132102948.176
0.3-0.1
0.2
0.19999999999999998
0.20.20.2
백억4918493.431-19293851121
-19,288,932,627.569
-19288932627.569-19288932627.569-19288932627.569-19288932627.569
천만3284.829-89126410.23
-89,123,125.401
-89123125.40100001
-89123125.401-89123125.401-89123125.401
2938471.213/123234.315
23.8445859256
23.84458592560035
23.844585925600345
23.84458592560034922091
23.84458592560034922
십만281645.234-983234
-701,588.766
-701588.7660000001
-701588.766-701588.766-701588.766
23849.429*-39425.2
-940,268,508.2108
-940268508.2107999
-940268508.2108-940268508.2108-940268508.2108
381293.328*1239
472,422,433.392
472422433.39199996
472422433.392472422433.392472422433.392
0.28+0.14
0.42
0.42000000000000004
0.420.420.42
2341313.809/2123
1,102.8326938295
1102.8326938294865
1102.8326938294863
1102.83269382948657560057
1102.8326938294865756
34901.939-81232.30
-46,330.361
-46330.361000000004
-46330.361-46330.361-46330.361
919394002.329/2931340.2
313.6428867345
313.64288673453865
313.64288673453865
313.6428867345386932571
313.64288673453869325
38.9+42.08
80.98
80.97999999999999
80.9880.9880.98
128.28+10.14
138.42
138.42000000000002
138.42138.42138.42
십억3913423411340.1/1234.2341
3,170,730,262.0630074
3170730262.063008
3170730262.0630074
3170730262.06300733385992171177
3170730262.0630073338
29381.3/3
9,793.7666666667
9793.766666666666
9793.766666666666
9793.76666666666666666667
9793.7666666666666666
십만410923.231-0.12
410,923.111
410923.11100000003
410923.111410923.111410923.111
12839.302-13294
-454.698
-454.6980000000003
-454.698-454.698-454.698
(1300*(700/4000))
227.5
227.49999999999997
227.5227.5227.5
백억18482839424.887-21.3
18,482,839,403.587
18482839403.58718482839403.58718482839403.58700000018482839403.58700000
백억78193947130.129-29.1
78,193,947,101.029
78193947101.02899
78193947101.02978193947101.02900000078193947101.02900000
천억820818341235.73-12.6
820,818,341,223.13
820818341223.13820818341223.13820818341223.13000000820818341223.1300000
천억923971405723.11+2.9
923,971,405,726.01
923971405726.01923971405726.01923971405726.01000000923971405726.0100000
1818293923481.139-22.1
1818293923459.039
1818293923459.0388
1818293923459.0391818293923459.03900001818293923459.039000
7238491929383.12+12.001
7238491929395.121
7238491929395.1217238491929395.1217238491929395.12100007238491929395.121000
십조34442312353404.29-9.1
34442312353395.19
34442312353395.188
34442312353395.188
34442312353395.19000034442312353395.19000
십조63841928356381.72+3.5
63841928356385.22
63841928356385.2263841928356385.2263841928356385.22000063841928356385.22000
백조245163552541345.42-2.3
245163552541343.12
245163552541343.1
245163552541343.1
245163552541343.10000
245163552541343.1000
백조712384918238481.82-1.5
712384918238480.32
712384918238480.4
712384918238480.4
712384918238480.40000
712384918238480.4000
천조3858182384858273.731-13.2
3858182384858260.531
3858182384858260.5
3858182384858260
3858182384858260.3000
3858182384858260.300
천조8237193570128429.872-0.22
8237193570128429.652
8237193570128430
8237193570128430
8237193570128430.2200
8237193570128430.220
천조7741233947451238.142+8
7741233947451246.142
7741233947451246
7741233947451247
7741233947451246.0000
7741233947451246.000
천조8819384782378482.204+9
8819384782378491.204
8819384782378491
8819384782378491
8819384782378491.0000
8819384782378491.000
천조9007199254740991.09+2.111
9007199254740993.201
9007199254740994
9007199254740994
9007199254740993.1110
9007199254740993.111
천조9820129392394923.731+2
9820129392394925.731
9820129392394926
9820129392394926
9820129392394926.0000
9820129392394926.000
98347519485498555.82+3.001
98347519485498558.821
98347519485498560
98347519485498560
98347519485498563.001
98347519485498563.00
12383574812093234.22+5.072
12383574812093239.292
12383574812093240
12383574812093238
12383574812093239.072
12383574812093239.07
82871198272712738.89-7.113
82871198272712731.777
82871198272712740
82871198272712740
82871198272712732.887
82871198272712732.89
46192982100923718-1.8
46192982100923716.2
46192982100923720
46192982100923720
46192982100923718.200
46192982100923718.20

b. test case - 소수 둘째 자리까지 표현(셋째 자리에서 반올림)

숫자 단위계산식계산기js-소수 둘째 자리자체 해결-소수 둘째 자리big.js-소수 둘째 자리decimal.js-light-소수 둘째 자리
0.1+0.2
0.3
0.300.300.30.30
0.28*14
3.92
3.923.923.923.92
0.1*87
8.7
8.708.708.78.70
백억4674.569*7474757
34,941,267,354.73
34941267354.7334941267354.7334941267354.7334941267354.73
767565.568*6775675
5,200,774,829,958.4
5200774829958.405200774829958.405200774829958.45200774829958.40
천만239281.121*244
58,384,593.52
58384593.5258384593.5258384593.5258384593.52
천억498581.244*751411
374,639,431,135.28
374639431135.28374639431135.28374639431135.28374639431135.28
234.234*23
5,387.38
5387.385387.385387.385387.38
백만4533.1*355
1,609,250.5
1609250.501609250.501609250.51609250.50
천만345313.877*49
16,920,379.97
16920379.9716920379.9716920379.9716920379.97
십억37485.34*34777
1,303,627,669.18
1303627669.181303627669.181303627669.181303627669.18
2421.55*64529
156,260,199.95
156260199.95156260199.95156260199.95156260199.95
백만87291.127*20
1,745,822.54
1745822.541745822.541745822.541745822.54
천만93971.589*729
68,505,288.38
68505288.3868505288.3868505288.3868505288.38
백만8291.798*522
4,328,318.56
4328318.564328318.564328318.564328318.56
십억727191.32*2801423
2,037,170,489,248.36
2037170489248.362037170489248.362037170489248.362037170489248.36
십억8381.1*919209
7,703,982,549.9
7703982549.907703982549.907703982549.97703982549.90
십억920123.977*2918
2,684,921,764.89
2684921764.892684921764.892684921764.892684921764.89
천억92384.618*4914731
454,045,546,007.76
454045546007.76454045546007.76454045546007.76454045546007.76
십억2919723.996*999
2,916,804,272.00
2916804272.002916804272.0029168042722916804272.00
십억819842.376*1929
1,581,475,943.30
1581475943.301581475943.301581475943.31581475943.30
백억828394.348*46134
38,217,144,850.63
38217144850.6338217144850.6338217144850.6338217144850.63
천만28012.129*2394
67,061,036.83
67061036.8367061036.8367061036.8367061036.83
81923.188*1920
157,292,520.96
157292520.96157292520.96157292520.96157292520.96
238129.219*2989
711,768,235.59
711768235.59711768235.59711768235.59711768235.59
십억951947.349*1838
1,749,679,227.46
1749679227.461749679227.461749679227.461749679227.46
천억4737123.001*92389
437,658,056,939.39
437658056939.39437658056939.39437658056939.39437658056939.39
천조567567.568*5675567657
3,221,268,132,102,948.18
3221268132102948.0
3221268132102948.50
3221268132102948.183221268132102948.18
0.3-0.1
0.2
0.200.200.20.20
백억4918493.431-19293851121
-19,288,932,627.57
-19288932627.57-19288932627.57-19288932627.57-19288932627.57
천만3284.829-89126410.23
-89,123,125.40
-89123125.40-89123125.40-89123125.4-89123125.40
2938471.213/123234.315
23.84
23.8423.8423.8423.84
십만281645.234-983234
-701,588.77
-701588.77-701588.77-701588.77-701588.77
23849.429*-39425.2
-940,268,508.21
-940268508.21-940268508.21-940268508.21-940268508.21
381293.328*1239
472,422,433.39
472422433.39472422433.39472422433.39472422433.39
0.28+0.14
0.42
0.420.420.420.42
2341313.809/2123
1,102.83
1102.831102.831102.831102.83
34901.939-81232.30
-46,330.36
-46330.36-46330.36-46330.36-46330.36
919394002.329/2931340.2
313.64
313.64313.64313.64313.64
38.9+42.08
80.98
80.9880.9880.9880.98
128.28+10.14
138.42
138.42138.42138.42138.42
십억3913423411340.1/1234.2341
3,170,730,262.06
3170730262.063170730262.063170730262.063170730262.06
29381.3/3
9,793.77
9793.779793.779793.779793.77
십만410923.231-0.12
410,923.11
410923.11410923.11410923.11410923.11
12839.302-13294
-454.70
-454.70-454.70-454.7-454.70
(1300*(700/4000))
227.5
227.5227.5227.5227.5
백억18482839424.887-21.3
18,482,839,403.59
18482839403.5918482839403.5918482839403.5918482839403.59
백억78193947130.129-29.1
78,193,947,101.03
78193947101.0378193947101.0378193947101.0378193947101.03
천억820818341235.73-12.6
820,818,341,223.13
820818341223.13820818341223.13820818341223.13820818341223.13
천억923971405723.11+2.9
923,971,405,726.01
923971405726.01923971405726.01923971405726.01923971405726.01
1818293923481.139-22.1
1818293923459.04
1818293923459.041818293923459.041818293923459.041818293923459.04
7238491929383.12+12.001
7238491929395.12
7238491929395.127238491929395.127238491929395.127238491929395.12
십조34442312353404.29-9.1
34442312353395.19
34442312353395.1934442312353395.1934442312353395.1934442312353395.19
십조63841928356381.72+3.5
63841928356385.22
63841928356385.2263841928356385.2263841928356385.2263841928356385.22
백조245163552541345.42-2.3
245163552541343.12
245163552541343.09
245163552541343.09
245163552541343.1
245163552541343.10
백조712384918238481.82-1.5
712384918238480.32
712384918238480.38
712384918238480.38
712384918238480.4
712384918238480.40
천조3858182384858273.731-13.2
3858182384858260.53
3858182384858260.50
3858182384858260.00
3858182384858260.3
3858182384858260.30
천조8237193570128429.872-0.22
8237193570128429.65
8237193570128430.00
8237193570128430.00
8237193570128430.22
8237193570128430.22
천조7741233947451238.142+8
7741233947451246.14
7741233947451246.00
7741233947451247.00
7741233947451246
7741233947451246.00
천조8819384782378482.204+9
8819384782378491.20
8819384782378491.00
8819384782378491.00
8819384782378491
8819384782378491.00
천조9007199254740991.09+2.111
9007199254740993.20
9007199254740994.00
9007199254740994.00
9007199254740993.11
9007199254740993.11
천조9820129392394923.731+2
9820129392394925.73
9820129392394926.00
9820129392394926.00
9820129392394926
9820129392394926.00
98347519485498555.82+3.001
98347519485498558.82
98347519485498560.00
98347519485498560.00
98347519485498563
98347519485498563.00
12383574812093234.22+5.072
12383574812093239.29
12383574812093240.00
12383574812093238.00
12383574812093239.07
12383574812093239.07
82871198272712738.89-7.113
82871198272712731.78
82871198272712736.00
82871198272712736.00
82871198272712732.89
82871198272712732.89
46192982100923718-1.8
46192982100923716.2
46192982100923720.00
46192982100923720.00
46192982100923718.2
46192982100923718.20

c. test case - 소수 첫째 자리까지 표현(둘째 자리에서 반올림)

input계산기js-소수 첫째 자리자체 해결-소수 첫째 자리big.js-소수 첫째 자리decimal.js-light-소수 첫째 자리
0.1+0.2
0.3
0.30.30.30.3
0.28*14
3.9
3.93.93.93.9
0.1*87
8.7
8.78.78.78.7
백억4674.569*7474757
34,941,267,354.7
34941267354.734941267354.734941267354.734941267354.7
767565.568*6775675
5,200,774,829,958.4
5200774829958.45200774829958.45200774829958.45200774829958.4
천만239281.121*244
58,384,593.524
58384593.558384593.558384593.558384593.5
천억498581.244*751411
374,639,431,135.3
374639431135.3374639431135.3374639431135.3374639431135.3
234.234*23
5,387.4
5387.45387.45387.45387.4
백만4533.1*355
1,609,250.5
1609250.51609250.51609250.51609250.5
천만345313.877*49
16,920,380.0
16920380.016920380.01692038016920380.0
십억37485.34*34777
1,303,627,669.2
1303627669.21303627669.21303627669.21303627669.2
2421.55*64529
156,260,200.0
156260200.0156260199.9156260200156260200.0
백만87291.127*20
1,745,822.5
1745822.51745822.51745822.51745822.5
천만93971.589*729
68,505,288.4
68505288.468505288.468505288.468505288.4
백만8291.798*522
4,328,318.6
4328318.64328318.64328318.64328318.6
십억727191.32*2801423
2,037,170,489,248.4
2037170489248.42037170489248.42037170489248.42037170489248.4
십억8381.1*919209
7,703,982,549.9
7703982549.97703982549.97703982549.97703982549.9
십억920123.977*2918
2,684,921,764.9
2684921764.92684921764.92684921764.92684921764.9
천억92384.618*4914731
454,045,546,007.8
454045546007.8454045546007.8454045546007.8454045546007.8
십억2919723.996*999
2,916,804,272.0
2916804272.02916804272.029168042722916804272.0
십억819842.376*1929
1,581,475,943.3
1581475943.31581475943.31581475943.31581475943.3
백억828394.348*46134
38,217,144,850.6
38217144850.638217144850.638217144850.638217144850.6
천만28012.129*2394
67,061,036.8
67061036.867061036.867061036.867061036.8
81923.188*1920
157,292,521.0
157292521.0157292521.0157292521157292521.0
238129.219*2989
711,768,235.6
711768235.6711768235.6711768235.6711768235.6
십억951947.349*1838
1,749,679,227.5
1749679227.51749679227.51749679227.51749679227.5
천억4737123.001*92389
437,658,056,939.4
437658056939.4437658056939.4437658056939.4437658056939.4
천조567567.568*567556,657
3,221,268,132,102,948.2
3221268132102948.0
3221268132102948.5
3221268132102948.23221268132102948.2
0.3-0.1
0.2
0.20.20.20.2
백억4918493.431-19293851121
-19,288,932,627.6
-19288932627.6-19288932627.6-19288932627.6-19288932627.6
천만3284.829-89126410.23
-89,123,125.4
-89123125.4-89123125.4-89123125.4-89123125.4
2938471.213/123234.315
23.8
23.823.823.823.8
십만281645.234-983234
-701,588.8
-701588.8-701588.8-701588.8-701588.8
23849.429*-39425.2
-940,268,508.2
-940268508.2-940268508.2-940268508.2-940268508.2
381293.328*1239
472,422,433.4
472422433.4472422433.4472422433.4472422433.4
0.28+0.14
0.4
0.40.40.40.4
2341313.809/2123
1,102.8
1102.81102.81102.81102.8
34901.939-81232.30
-46,330.4
-46330.4-46330.4-46330.4-46330.4
919394002.329/2931340.2
313.6
313.6313.6313.6313.6
38.9+42.08
81.0
81.081.08181.0
128.28+10.14
138.4
138.4138.4138.4138.4
십억3913423411340.1/1234.2341
3,170,730,262.1
3170730262.13170730262.13170730262.13170730262.1
29381.3/3
9,793.8
9793.89793.89793.89793.8
십만410923.231-0.12
410,923.1
410923.1410923.1410923.1410923.1
12839.302-13294
-454.7
-454.7-454.7-454.7-454.7
(1300*(700/4000))
227.5
227.5227.5227.5227.5
백억18482839424.887-21.3
18,482,839,403.6
18482839403.618482839403.618482839403.618482839403.6
백억78193947130.129-29.1
78,193,947,101.0
78193947101.078193947101.07819394710178193947101.0
천억820818341235.73-12.6
820,818,341,223.1
820818341223.1820818341223.1820818341223.1820818341223.1
천억923971405723.11+2.9
923,971,405,726.0
923971405726.0923971405726.0923971405726923971405726.0
1818293923481.139-22.1
1818293923459.0
1818293923459.01818293923459.018182939234591818293923459.0
7238491929383.12+12.001
7238491929395.1
7238491929395.17238491929395.17238491929395.17238491929395.1
십조34442312353404.29-9.1
34442312353395.2
34442312353395.234442312353395.234442312353395.234442312353395.2
십조63841928356381.72+3.5
63841928356385.2
63841928356385.263841928356385.263841928356385.263841928356385.2
백조245163552541345.42-2.3
245163552541343.1
245163552541343.1245163552541343.1245163552541343.1245163552541343.1
백조712384918238481.82-1.5
712384918238480.3
712384918238480.4
712384918238480.4
712384918238480.4
712384918238480.4
천조3858182384858273.731-13.2
3858182384858260.5
3858182384858260.5
3858182384858260.0
3858182384858260.3
3858182384858260.3
천조8237193570128429.872-0.22
8237193570128429.7
8237193570128430.0
8237193570128430.0
8237193570128430.2
8237193570128430.2
천조7741233947451238.142+8
7741233947451246.1
7741233947451246.0
7741233947451247.0
7741233947451246
7741233947451246.0
천조8819384782378482.204+9
8819384782378491.2
8819384782378491.0
8819384782378491.0
8819384782378491
8819384782378491.0
천조9007199254740991.09+2.111
9007199254740993.2
9007199254740994.0
9007199254740994.0
9007199254740993.1
9007199254740993.1
천조9820129392394923.731+2
9820129392394925.7
9820129392394926.0
9820129392394926.0
9820129392394926
9820129392394926.0
98347519485498555.82+3.001
98347519485498558.8
98347519485498560.0
98347519485498560.0
98347519485498563
98347519485498563.0
12383574812093234.22+5.072
12383574812093239.3
12383574812093240.0
12383574812093238.0
12383574812093239.1
12383574812093239.1
82871198272712738.89-7.113
82871198272712731.8
82871198272712736.0
82871198272712736.0
82871198272712732.9
82871198272712732.9
46192982100923718-1.8
46192982100923716.2
46192982100923720.0
46192982100923720.0
46192982100923718.2
46192982100923718.2

d. test case - 정수로 표현

숫자 단위계산식계산기js-정수자체 해결-정수big.js-정수decimal.js-light-정수
0.1+0.2
0
0000
0.28*14
4
4444
0.1*87
9
9999
백억4674.569*7474757
34,941,267,355
34941267355349412673553494126735534941267355
767565.568*6775675
5,200,774,829,958
5200774829958520077482995852007748299585200774829958
천만239281.121*244
58,384,594
58384594583845945838459458384594
천억498581.244*751411
374,639,431,135
374639431135374639431135374639431135374639431135
234.234*23
5,387
5387538753875387
백만4533.1*355
1,609,251
1609251160925116092511609251
천만345313.877*49
16,920,380
16920380169203801692038016920380
십억37485.34*34777
1,303,627,669
1303627669130362766913036276691303627669
2421.55*64529
156,260,200
156260200156260200156260200156260200
백만87291.127*20
1,745,823
1745823174582317458231745823
천만93971.589*729
68,505,288
68505288685052886850528868505288
백만8291.798*522
4,328,319
4328319432831943283194328319
십억727191.32*2801423
2,037,170,489,248
2037170489248203717048924820371704892482037170489248
십억8381.1*919209
7,703,982,550
7703982550770398255077039825507703982550
십억920123.977*2918
2,684,921,765
2684921765268492176526849217652684921765
천억92384.618*4914731
454,045,546,008
454045546008454045546008454045546008454045546008
십억2919723.996*999
2,916,804,272
2916804272291680427229168042722916804272
십억819842.376*1929
1,581,475,943
1581475943158147594315814759431581475943
백억828394.348*46134
38,217,144,851
38217144851382171448513821714485138217144851
천만28012.129*2394
67,061,037
67061037670610376706103767061037
81923.188*1920
157,292,521
157292521157292521157292521157292521
238129.219*2989
711,768,236
711768236711768236711768236711768236
십억951947.349*1838
1,749,679,227
1749679227174967922717496792271749679227
천억4737123.001*92389
437,658,056,939
437658056939437658056939437658056939437658056939
천조567567.568*567556,657
3,221,268,132,102,948
3221268132102948
3221268132102949
32212681321029483221268132102948
0.3-0.1
0
0000
백억4918493.431-19293851121
-19,288,932,628
-19288932628-19288932628-19288932628-19288932628
천만3284.829-89126410.23
-89,123,125
-89123125-89123125-89123125-89123125
2938471.213/123234.315
24
24242424
십만281645.234-983234
-701,589
-701589-701589-701589-701589
23849.429*-39425.2
-940,268,508
-940268508-940268508-940268508-940268508
381293.328*1239
472,422,433
472422433472422433472422433472422433
0.28+0.14
0
0000
2341313.809/2123
1,103
1103110311031103
34901.939-81232.30
-46,330
-46330-46330-46330-46330
919394002.329/2931340.2
314
314314314314
38.9+42.08
81
81818181
128.28+10.14
138
138138138138
십억3913423411340.1/1234.2341
3,170,730,262
3170730262317073026231707302623170730262
29381.3/3
9,794
9794979497949794
십만410923.231-0.12
410,923
410923410923410923410923
(1300*(700/4000))
228
227.5227.5227.5227.5
12839.302-13294
-455
-455-455-455-455
백억18482839424.887-21.3
18,482,839,404
18482839404184828394041848283940418482839404
백억78193947130.129-29.1
78,193,947,101
78193947101781939471017819394710178193947101
천억820818341235.73-12.6
820,818,341,223
820818341223820818341223820818341223820818341223
천억923971405723.11+2.9
923,971,405,726
923971405726923971405726923971405726923971405726
1818293923481.139-22.1
1818293923459
1818293923459181829392345918182939234591818293923459
7238491929383.12+12.001
7238491929395
7238491929395723849192939572384919293957238491929395
십조34442312353404.29-9.1
34442312353395
34442312353395344423123533953444231235339534442312353395
십조63841928356381.72+3.5
63841928356385
63841928356385638419283563856384192835638563841928356385
백조245163552541345.42-2.3
245163552541343
245163552541343245163552541343245163552541343245163552541343
백조712384918238481.82-1.5
712384918238480
712384918238480712384918238480712384918238480712384918238480
천조3858182384858273.731-13.2
3858182384858261
3858182384858261
3858182384858260
3858182384858260
3858182384858260
천조8237193570128429.872-0.22
8237193570128430
8237193570128430823719357012843082371935701284308237193570128430
천조7741233947451238.142+8
7741233947451246
7741233947451246774123394745124777412339474512467741233947451246
천조8819384782378482.204+9
8819384782378491
8819384782378491881938478237849188193847823784918819384782378491
천조9007199254740991.09+2.111
9007199254740993
9007199254740994
9007199254740994
90071992547409939007199254740993
천조9820129392394923.731+2
9820129392394926
9820129392394926982012939239492698201293923949269820129392394926
98347519485498555.82+3.001
98347519485498559
98347519485498560
98347519485498560
98347519485498563
98347519485498563
12383574812093234.22+5.072
12383574812093239
12383574812093240
12383574812093238
1238357481209323912383574812093239
82871198272712738.89-7.113
82871198272712732
82871198272712736
82871198272712736
82871198272712733
82871198272712733
46192982100923718-1.8
46192982100923716
46192982100923720
46192982100923720
46192982100923718
46192982100923718


💡TL;DR

부동소수점을 해결하는 방법

  • 10의 거듭제곱을 곱해 소수점을 제거한 후 연산한 다음 곱해준 10의 거듭제곱을 나눠 보정
  • JavaScript의 toFixed()를 사용하는 방법
  • 라이브러리 사용
    • big.js
    • decimal.js
    • decimal.js-light
    • etc

© 2024 Park Seohyun