β νλ‘κ·Έλλ°μ λ°°μ°λ κ²κ³Ό μΈν°λ ν°λΈ μννΈμ¨μ΄ μ€κ³λ νμλ₯Ό λ°°μ°λ κ²κ³Ό μλ₯Ό μ°λ κ²μ κ΄κ³ λ³΄λ€ λ μκ΄ μλ μΌμ΄λ€. β
- Ted Nelson
HTMLμ λ§λ μ¬ν κ³Όνμ

μ€μμ 2μ§μ νν
10μ§μμ μ μλ₯Ό 2μ§μμ μ μλ‘ λ³νν μ μλ―μ΄, 10μ§μμ μμλ₯Ό 2μ§μμ μμλ‘ λ³νν μ μλ€.
μλ₯Όλ€μ΄ 10μ§μ 11.765625 λ₯Ό 2μ§μ μμλ‘ λ³ννλ λ°©λ²μ λ€μκ³Ό κ°λ€. λ¨Όμ μ«μλ₯Ό μ μλΆ 11 μ μμλΆ 0.765625 λ‘ λλμ΄μ£Όκ³ , κ°κ° 2μ§μλ‘ λ³νν΄μ£Όλ©΄ λλ€.
μ μλΆ 2μ§μ λ³ν

- μ μλΆμ 2λ₯Ό μ§μμ μΌλ‘ λλλ€.
- λͺ«μ κ³μ 2λ‘ λλμ΄μ£Όκ³ , λλ¨Έμ§κ°μ λ°λ‘ λͺ¨μμ€λ€.
- λμ΄μ λλμ μμλ λλ¨Έμ§ κ°μ λͺ¨μ μ°κ²°ν΄μ£Όλ©΄ 1011(2)λ‘ κ°λ¨ν λ³νμ΄ λλ€.
μ€μλΆ 2μ§μ λ³ν

- μ λκ°μ΄ 1λ³΄λ€ μμ 10μ§μ μμμ 2λ₯Ό κ³±νλ€.
- 2λ₯Ό κ³±ν κ²°κ³Όλ 1μ λκ±°λ λμ§ μμ κ²μ΄λ€.
- λ§μ½ 1μ λμμ κ²½μ° κ²°κ³Όμμ 1μ λΌμ΄λ΄κ³ , μλλ©΄ 0μΌλ‘ μ²λ¦¬νλ©° λ€μ κ³μ°μ μ΄μ΄λκ°λ€.
- μμμ μ΄νμ μ무 μ«μλ λ¨μ§ μμ λκΉμ§ κ³±μ μ λ°λ³΅νλ€.
- μ΄ κ³Όμ μμ λ§λ€μ΄μ§ κ²°κ³Όμ μ μ λΆλΆ(0 λλ 1)λ€μ μμλλ‘ μ°λ©΄ ν΄λΉ μμμ 2μ§μ λ³ν κ°μ΄ λμ¨λ€.
μ¦, μμ§μ μ€μ 11.765625 λ₯Ό μ΄μ§μλ‘ λ³νν΄μ£Όλ©΄ 1011.110001(2) λΌλ κ²°κ³Όκ° λμ΄μ νμΈν μ μλ€.
2μ§μμμ 10μ§μ μ€μλ‘ λ³ννλ λ°©λ²μ μμ μ μλΆμ μμλΆλ₯Ό λλκ³ , μ μλΆλ 2μ nμΉμ, μμλΆλ 2μ -nμΉμ κ³±νμ¬ μ£Όλ©΄ λλ€.
μλ₯Ό λ€μ΄ 101.101(2) μ΄μ§μ μ€μμ μμ§μ λ³ν κ³μ°λ²μ λ€μκ³Ό κ°λ€.
2μ§μ 무ν μμ
νμ§λ§ λͺ¨λ μμ§μ μ€μλ₯Ό μμ κ°μ΄ κΉλνκ² 2μ§μλ‘ λ³ννλ κ²μ μλλ€.
μλ₯Ό λ€μ΄ 0.1μ 2μ§μλ‘ λ³ννκ² λλ€λ©΄ κ°μ΄ λλμ΄ λ¨μ΄μ§μ§ μκ³ 0.0001100110011... λ‘ λ¬΄νμΌλ‘ λ°λ³΅λλ νμμ΄ λνλλ€.
μ΄λ₯Ό 무ν μμλΌκ³ λΆλ¦¬μ΄λ€.

μ΄μ²λΌ 10μ§μμ μΈκ³μμ 2μ§μμ μΈκ³λ‘ μμμ μ λ³ννλ κ²μ λ§μ κ²½μ° μ νν λ³νμ΄ λΆκ°λ₯νλ€.
μμμ λμ΄ 5κ° μλ μλ₯Ό 2μ§μλ‘ μμλ₯Ό ννν κ²½μ° λ¬΄ν μμκ° λ°μνλ€κ³ 보면 λλ€.
μ€μμ λ©λͺ¨λ¦¬ νν
μ»΄ν¨ν°μ λ©λͺ¨λ¦¬λ 2μ§μ 체κ³λ₯Ό κΈ°λ°μΌλ‘ λ°μ΄ν°λ₯Ό μ μ₯νλ€.
λΉμ°ν μ€μλ 2μ§μλ‘ λ©λͺ¨λ¦¬ λΉνΈλ‘ ννν΄μΌ νλ©° μ μμ λΉν΄μ μλμ μΌλ‘ 볡μ‘ν νΈμ΄λ€.
μ»΄ν¨ν°μμ μ€μλ₯Ό νννλ λ°©μμΌλ‘λ λνμ μΌλ‘ κ³ μ μμμ λ°©μ(Fixed-Point Number Representation)κ³Ό λΆλ μμμ λ°©μ(Floating-Point Number Representation)μΌλ‘ λλ μ μλ€.
κ³ μ μμμ λ°©μ
κ³ μ μμμ λ°©μμ λ©λͺ¨λ¦¬λ₯Ό μ μλΆμ μμλΆλ‘ κ³ μ μΌλ‘ λλκ³ μ§μ νμ¬ μ²λ¦¬νλ λ°©μμ΄λ€.
μμλΆμ μλ¦Ώμλ₯Ό 미리 μ νκ³ κ³ μ λ μλ¦Ώμμ μμλ₯Ό νννκΈ° λλ¬Έμ μ§κ΄μ μ΄λ€.

맨 μ’μΈ‘μ 1bit λΆνΈ λΉνΈλ μμ/μμλ₯Ό νννκΈ° μν λΉνΈμ΄λ€. 0μ΄λ©΄ μμ, 1μ΄λ©΄ μμλ₯Ό ν΅μΉνλ€.
μλ₯Όλ€μ΄ 5.625 μ«μλ₯Ό μ΄μ§μλ‘ λ³ννκ³ μ»΄ν¨ν° λ©λͺ¨λ¦¬μ κ³ μ μμμ λ°©μμΌλ‘ νννλ€λ©΄ λ€μκ³Ό κ°μ΄ λλ€.

μ¦, μμμ μ΄ν΄λ³΄μλ μ΄μ§μ μ€μ κ³μ°λ²μ κ·Έλλ‘ μ μ©νκ³ κ²°κ³Όκ°μ κ°κ° μ μλΆ, μμλΆ λ©λͺ¨λ¦¬ λΉνΈμ λ£μ΄μ£Όλ©΄ μ€μ ννμ΄ μλ£λλ κ²μ΄λ€.
μ΄μ²λΌ μ§κ΄μ μΌλ‘ λ©λͺ¨λ¦¬μ μ€μ ννμ ν μ μλ€λ μ₯μ μ΄ μμ§λ§, νν κ°λ₯ν λ²μκ° λ§€μ° μ λ€λ μΉλͺ μ μΈ λ¨μ μ΄ μλ€.
Javaμ float νμ
μ κΈ°μ€μΌλ‘ μ€μ λ©λͺ¨λ¦¬λ μ΄ 32λΉνΈλ₯Ό ν λΉλ°κ² λλλ°, κ³ μ μμμ λ°©μμΌλ‘ λ©λͺ¨λ¦¬λ₯Ό λ°λ΅μΌλ‘ λλμ΄ μ€κ³νμλ€λ©΄, λ€μκ³Ό κ°μ΄ μ μλΆ λΉνΈμμ μ΅λλ‘ ννν μ μλ μ«μλ 2^15 - 1 μΈ 32767 μ΄ λκ² λλ€.
μ¦, 40000.01 μ΄λΌλ μ€μκ° μλ€λ©΄ νν λ²μλ₯Ό λμ΄ λ©λͺ¨λ¦¬μ μ μ¬ν μ μκ² λλ κ²μ΄λ€.

μ΄λ°μλ λλΉλλ 곡κ°μ΄ λ§μ΄ μκΈ΄λ€λ λ¨μ λ μ‘΄μ¬νλ€.
22777.12 λΌλ μ€μκ° μμ κ²½μ°, κ³ μ 0.12 λΌλ μμ μ«μλ₯Ό νννκΈ° μν΄ 16λΉνΈμ μμλΆλ₯Ό λͺ¨λ μ¬μ©νλ€λ κ²μ μ무리 λ΄λ μ€κ³ λ―Έμ€λΌκ³ λ°μ 보μ΄μ§ μλλ€.
κ°μ μ€μλΌκ³ ν΄λ μ μλΆκ° ν° μ€μ(32001.1)κ° μκ³ μμλΆκ° ν° μ€μ(2.1008101)λ μκΈ° λλ¬Έμ΄λ€.
λ°λΌμ μ΄λ¬ν κ³΅κ° λλΉλ₯Ό μ€μ΄κ³ ν¨μ¨μ μΌλ‘ μ€μ λ©λͺ¨λ¦¬λ₯Ό νννκΈ° μν΄ μ»΄ν¨ν°λ λΆλ μμμ λ°©μμ μ¬μ©νλ€.
λΆλ μμμ λ°©μ
λΆλ μμμ (floating point) λ°©μμ μμμ (point) μ΄ λ₯λ₯ λ λ€λλ€ (floating) λΌλ μλ―Έλ‘, ννν μ μλ κ°μ λ²μλ₯Ό μ΅λν λν μ€μ°¨λ₯Ό μ€μ΄μλ μλμμ νμν λ μμ΄λ€.
λΆλ μμμ μ κ³ μ μμμ λ°©μκ³Όλ λ¬λ¦¬ λ©λͺ¨λ¦¬λ₯Ό κ°μλΆ(23bit)μ μ§μλΆ(8bit)λ‘ λλλ€.

κΈ°μλΆ μλ μ€μ μ€μ λ°μ΄ν° λΉνΈλ€μ΄ λ€μ΄κ°κ³ , μ§μλΆμλ μμμ μ μμΉλ₯Ό κ°λ¦¬ν€λ μ κ³±μΉ μ΄ λ€μ΄κ°λ€κ³ 보면 λλ€.

λκ° μ§κ΄μ μ΄μ§ μμ μ€νλ € λ²κ±°λ‘κ² λ³΄μΌμλ μκ³μ§λ§, μ΄λ°μμΌλ‘ μ€μλ₯Ό νννλ μ΄μ λ ν° λ²μμ κ°μ νννκΈ° μν΄ μμ΄λ€.
μμ κ³ μ μμμ λ°©μμμλ λ°λ‘ 물리μ μΌλ‘ μ μλΆμ μμλΆλ‘ λλμ΄ κ°κ° 15bit, 16bit λ°μ μ¬μ©νμ§ λͺ»νμμ§λ§, λΆλμμμ λ°©μμ μ€μμ κ° μ체λ₯Ό κ°μλΆ(23bit)μ λ£μ΄ νννκΈ° λλ¬Έμ λ³΄λ€ ν° λΉνΈμ λ²μλ₯Ό κ°μ§κ² λλ©°, μ μλΆκ° ν¬λ μμλΆκ° ν¬λ μκ΄μμ΄ κ°μλΆ λ΄μμ μ 체 μ€μλ₯Ό νννκΈ° λλ¬Έμ κ³΅κ° λλΉ λ¬Έμ λ ν΄κ²°λλ κ²μ΄λ€.

μ§μ(e) νκΈ°λ²
μ§μ νκΈ°λ²μ μμ£Ό ν° μ«μλ μμ£Ό μμ μ«μλ₯Ό κ°λ¨νκ² νκΈ°ν λ μ¬μ©λλ νκΈ°λ²μΌλ‘, κ³Όνμ νκΈ°λ²(scientific notation) μ΄λΌλκ³ λΆλ¦¬μ΄λ€.
κΈΈλ€λ μ€μ μ«μλ₯Ό λνλ΄λ λ° νμν μλ¦Ώμλ₯Ό μ€μ¬ ννν΄μ€λ€λ μ₯μ μ΄ μλ€.
ν° λ²μμ κ°μ΄λΌκ³ ν΄μ μΌλ§λ ν° λ²μλ νλ©΄μ, μ€μ λ‘ μλ°μ νμ λ²μλ€μ 보면 8λ°μ΄νΈλ₯Ό μ¬μ©νλ μ μν long νμ μ λ²μ보λ€, 4λ°μ΄νΈλ₯Ό μ¬μ©νλ μ€μν float νμ μ λ²μκ° ν¨μ¬ λ ν¬λ€λ κ²μ λ³Ό μ μλ€.

double a = 9223372036854775808.0; // λΉκ΅λ₯Ό μν΄ μ€μλ‘ νν
double b = 3.4 * (Math.pow(10, 38)); // 3.4 x 10^38
System.out.println(a); // 9.223372036854776 x 10^18
System.out.println(b); // 3.4 x 10^38
System.out.println(a < b); // true
long νμ μ μ΅λ ν¬κΈ°μΈ 9223372036854775808 μ float νμ μ μ΅λ ν¬κΈ°μΈ 3.4 x 10^38 λ₯Ό λΉκ΅ν΄λ³΄λ 4λ°μ΄νΈμ μ€μν float μ΄ ν¨μ¬ μμ λ²μκ° ν°κ²μ μ½λλ₯Ό ν΅ν΄ νμΈν μ μλ€.
λΆλ μμμ κ³μ° λ°©λ²
νμ¬ μ¬μ©λκ³ μλ λΆλ μμμ λ°©μμ λλΆλΆ IEEE 754 νμ€μ λ°λ₯΄κ³ μλ€. κ·Έλ¦¬κ³ μλ°λ μ΄ νμ€μ λ°λ₯Έλ€.
IEEE 754 νμ€μ λΆλ μμμ μνμ μμμ λ€μκ³Ό κ°μ΄ λλ€.
Β±(1.M) Γ 2οΌΎE-127
Β±(1.κ°μλΆ) Γ 2^μ§μλΆ-127

κΈ°νΈ | μλ―Έ | μ€λͺ |
S | λΆνΈ(Sign bit) | 0μ΄λ©΄ μμ, 1μ΄λ©΄ μμ |
E | μ§μλΆ(Exponent) | λΆνΈμλ μ μ. μ§μμ λ²μλ οΌ127 ~ 128(float), οΌ1023 ~ 1024(double) |
M | κ°μλΆ(Mantissa) | μ€μ κ°μ μ μ₯νλ λΆλΆ. 10μ§μλ‘ 7μ리(float), 15μ리(double)μ μ λ°λλ‘ μ μ₯ κ°λ₯ |
μ΄μ κ·ΈλΌ -118.625 λΌλ μ€μλ₯Ό λΆλ μμμ μΌλ‘ λ³ννλ μλ₯Ό μ§μ νν΄λ³΄μ.
1. μμμ΄κΈ°μ μ΅μμ λΉνΈλ₯Ό 1λ‘ μ€μ ν΄μ€λ€.

2. μ λκ° 118.625 λ₯Ό μ΄μ§λ²μΌλ‘ λ³νν΄μ€λ€.
# μ μλΆ λ³ν
118
= 1110110(2)
# μμλΆ λ³ν
0.625
= 0.625 x 2 = 1.250 β μ μλΆ 1
= 0.250 x 2 = 0.500 β μ μλΆ 0
= 0.500 x 2 = 1.000 β μ μλΆ 1
= 101(2)
# κ²°κ³Ό
118.625
= 1110110.101(2)
3. μμμ μ μ΄λμμΌ μ μλΆκ° νμλ¦¬κ° λλλ‘ λ³νν΄μ€λ€. (κ·Έλ¬λ©΄ μ§μ 6μ΄ λ§λ€μ΄μ§λ€)
1110110.101 β 1.110110101 x 2^6
μμμ μ μ΄λμν€λ κ²μ μ κ·ν(Normalization) μ΄λΌκ³ λΆλ₯Έλ€.
μ κ·νλΌλ λ¨μ΄λ μνμ΄λ μ»΄ν¨ν° λΆμΌμμ λ€μν μλ―Έλ‘ μ°μ΄μ§λ§ μ¬κΈ°μ λ§νλ μ κ·νλΌλ κ²μ 2μ§μλ₯Ό 1.xxxx... * 2^n κΌ΄λ‘ λ³ννλ κ²μ λ§νλ€κ³ 보면 λλ€.
4. κ°μλΆ λΉνΈμ μ€μκ° κ·Έλλ‘λ₯Ό λ£λλ€ (μ 무μ)

5. μ§μμ λ°μ΄μ΄μ€ κ°(127)μ λνκ³ μ§μλΆ λΉνΈμ λ£λλ€.
6 + 127
= 133
= 100000101(2)

32bit IEEE 754 νμμλ biasλΌλ κ³ μ κ°(127)μ΄ μ‘΄μ¬νλ€.
μ΄ biasλΌλ κ°μ μ μ°λλ©΄, μ§μκ° μμκ° λ μλ μλ μΌμ΄μ€κ° μκΈ° λλ¬Έμ΄λ€. (2^10 or 2^-10)
μλ₯Ό λ€λ©΄ 0.000101(2)μ΄λΌλ μ΄μ§μκ° μλ€κ³ κ°μ νμ
μ΄λ₯Ό 1.xxxx... * 2^n νμμΌλ‘ νννκΈ° μν΄μ , μ€λ₯Έμͺ½μΌλ‘ μμμ μ λ°λ©΄ 1.01 * 2^-4 κ° λλ€.
μ΄ -4 μμ μ§μλ₯Ό 8μ리 λΉνΈλ‘ νννκΈ° μν΄, (10μ§μ κΈ°μ€μΌλ‘) 0~127 ꡬκ°μ μμ, 128~255 ꡬκ°μ μμλ₯Ό νννλλ‘ λ§λ κ²μ΄λ€.
κ·Έλμ κ³μ°λ μ§μμ 127 bias κ°μ λνμ¬, 127λ³΄λ€ μμΌλ©΄ μμ, 127λ³΄λ€ ν¬λ©΄ μμλ‘ κ΅¬λΆν μ μλ κ²μ΄λ€.
μ΄μ κ°μ λΆλμμμ νν λ°©μμ κ³ μ μμμ νν λ°©μμ λΉν΄μ λΉνΈ μ λλΉ νν κ°λ₯ν μμ λ²μμ μ λ°λ μΈ‘λ©΄μμ λ³΄λ€ μ°μμ μκΈ° λλ¬Έμ, μ κ·νμ bias κ°μ 볡μ‘ν κ³Όμ μ΄ λ€μ΄κ°μλ λΆκ΅¬νκ³ νμ¬ λλΆλΆμ μ»΄ν¨ν° μμ€ν μμ λΆλμμμ μ μ΄μ©ν΄ μ€μλ₯Ό νννκ³ μλ€.
λ°°μ λ λΆλ μμμ λ°©μ
μλ°μμλ float(32bit) μ double(64bit) μλ£νμ΄ μλ κ²μ²λΌ,
λΆλ μμμ λ°©μμλ, μ§κΈκΉμ§ μμμ μ΄ν΄λ³Έ 32λΉνΈ 체κ³λ₯Ό 32λΉνΈ λ¨μ λ (Single-Precision), 64λΉνΈ 체κ³λ₯Ό 64λΉνΈ λ°°μ λ (Double-Precision) μ΄λΌκ³ λΆλ₯Έλ€.
doubleν 64λΉνΈ 체κ³μμλ μ§μλΆκ° 11λΉνΈ, κ°μλΆκ° 52λΉνΈλ€.
μ§μλΆκ° 2^11 μ¦ 2048κ°μ μλ₯Ό ννν μ μμΌλ―λ‘ 0~1023 ꡬκ°μ μμ, 1024~2047 ꡬκ°μ μμ μ§μλ₯Ό μλ―Ένλ©°, μ΄λ bias κ³ μ κ°μ 1023μ΄ λλ€λ μ°¨μ΄μ μ΄ μ‘΄μ¬νλ€.

νλ‘κ·Έλλ°μμμ μμ κ³μ° μ€μ°¨
μ§κΈκΉμ§ μ°λ¦¬λ μ»΄ν¨ν°μμ μ€μλ₯Ό μ μ₯νλ λ°©μμ κ³ μ μμμ λ°©μκ³Ό λΆλ μμμ λ°©μμ μμ보μκ³ , μ’λ ν° μλ₯Ό νννμ¬ μ μ₯ν μ μλ λΆλ μμμ λ°©μμ μ¬μ©νλ μ΄μ μ λν΄ μμ 보μλ€.
νμ§λ§ μ΄ μ―€μμ μ¬λ¬λΆμ΄ κ°κ³Όν λΆλΆμ΄ μλλ°, λ°λ‘ ν¬μ€ν μ΄λ°μ μκ°νμλ 무ν μμ λΆλΆ μ΄λ€.
0.625 κ°μ΄ μ΄μ§μ μμμ μΌλ‘ λ± λ¨μ΄μ§λ μλ λ¬Έμ μμ§λ§ 0.1 μ κ°μ΄ 0.0001100110011...(2) λ‘ λ¬΄ν λ°λ³΅λλ μ΄μ§μ μ€μλ μ무리 ν° μλ₯Ό μ μ₯νλ λΆλ μμμ λ°©μμ΄λΌ ν΄λ 무νλλ₯Ό μ μ₯ν μ μμΌλ κ²°κ΅ λ©λͺ¨λ¦¬ νκ³κΉμ§ μμμ μ μ§μ΄λ£κ³ μ΄λ λΆλΆμμ λμ΄ λ°μ¬λ¦Όμ ν΄μ£Όμ΄μΌ νλ€.
μ¦, μ»΄ν¨ν°μ λ©λͺ¨λ¦¬λ νμ μ μ΄κΈ° λλ¬Έμ μ€μμ μμ«μ μ ννν μ μλ μμ μ νμ΄ μ‘΄μ¬νκ² λ μ λ°μ μλ€.
κ·Έλ¦¬κ³ μ€μλ₯Ό νννλ μ«μ μ νμ΄ μλ€λ κ²μ κ³§ λΆμ νν μ€μμ κ³μ°κ°μ μ΄λνλ€λ λ»μ΄κΈ°λ νλ€.
μ΄κ²μ μλ°λΏλ§ μλλΌ, λͺ¨λ νλ‘κ·Έλλ° μΈμ΄μμ λ°μνλ κΈ°λ³Έμ μΈ λ¬Έμ μ΄λ€.
λ€μ μμ λ₯Ό μνν΄λ³΄λ©΄ μ»΄ν¨ν°μ μ€μ μ°μ° μ€μ°¨λ₯Ό λ°κ²¬ν μ μλ€.
double value1 = 12.23;
double value2 = 34.45;
// κΈ°λκ° : 46.68
System.out.println(value1 + value2); // 46.68000000000001
12.23 μ 34.45 μ λνμΌλ κΈ°λ κ²°κ³Όλ‘ 46.68 μ΄ λμμΌ λμ§λ§, μ€μ λ‘λ 46.68000000000001κ° μΆλ ₯λμ΄ λ²λ¦°λ€.
μ΄λ, 10μ§μ μμμ κ°μΈ 12.23 κ³Ό 34.45 μ 2μ§μλ‘ λ³ννλ κ³Όμ μμ μμμ μ΄ μλ¨μ΄μ§λ 무ν μμ νμμ΄ λνλ λ©λͺ¨λ¦¬ ν λΉ ν¬κΈ°μ νκ³ λλ¬Έμ μ΄λ μ리μ κΉμ§μ λ°μ¬λ¦Ό ννλ°μ λͺ»νκ³ , κ·Έλ° λΆμ νν κ°μ μ΄μ©ν΄ μ°μ°μ νμμΌλ λΉμ°ν κ²°κ³Όκ°λ λΆμ ννκ² λμ€κ² λ κ²μ΄λ€.
λ¬Όλ‘ μ μ체μ ν¬κΈ°λ‘μλ κ·Όμ¬ν μ°¨μ΄ μ λ λ°μ μλκ² μ§λ§, κΈμ΅μ΄λ λλ‘ κ³Ό κ°μ κ΄λ ¨ νλ‘κ·Έλ¨μμλ μ΄ μ€μ°¨κ° ν° μν₯μ λ―ΈμΉ μ μκΈ° λλ¬Έμ μμ£Ό μ νν κ³μ°μ΄ νμνλ€.
λ°λΌμ μ΄λ¬ν μ»΄ν¨ν°μ μ€μ μ°μ° λ¬Έμ λ₯Ό ν΄κ²° νκΈ° μν΄ μλ°(Java)μμλ λκ°μ§ λ°©λ²μ μ 곡νλ€.
κ²°λ‘ λΆν° λ§νμλ©΄ int, long μ μν νμ μΌλ‘ μΉννκ³ μ¬μ©νκ±°λ, BigDecimal ν΄λμ€λ₯Ό μ΄μ©νλ©΄ λλ€.
μμ μ νν κ³μ°νλ λ°©λ²
μ μ μΉννμ¬ κ³μ°
μλ₯Ό λ€μ΄ 25.35 μ 100μ κ³±ν΄μ 2535 λ‘ μ μλ‘ μΉνν΄μ κ³μ°νκ³ λ€μ 100μ λλμ΄μ μμ κ²°κ³Όκ°μ λμΆνλ μΌμ’ μ κΌΌμ λ°©λ²μ΄λΌκ³ 보면 λλ€.
double a = 1000.0;
double b = 999.9;
System.out.println(a - b); // 0.10000000000002274
// κ° μ«μμ 10μ κ³±ν΄μ μμλΆλ₯Ό μμ μ£Όκ³ μ μλ‘ νλ³ν
long a2 = (int)(a * 10);
long b2 = (int)(b * 10);
double result = (a2 - b2) / 10.0; // κ·Έλ¦¬κ³ μ μλΌλ¦¬ μ°μ°μ ν΄μ£Όκ³ , λ€μ 10.0μ λλκΈ° νμ¬ μ€μλ‘ λ³ννμ¬ μ μ₯
System.out.println(result); // 0.1
BigDecimal ν΄λμ€
λ€λ§ μμμ ν¬κΈ°κ° 9μ리λ₯Ό λμ§ μμΌλ©΄ int νμ μ μ¬μ©νλ©΄ λκ³ , 18μ리λ₯Ό λμ§ μμΌλ©΄ long νμ μ μ¬μ©νλ©΄ λμ§λ§, μ»΄ν¨ν°μμλ λ°μ΄ν°μ νν λ²μκ° μ νλμ΄ μκΈ° λλ¬Έμ, λ§μΌ 18μ리λ₯Ό μ΄κ³Όνλ©΄ BigDecimal ν΄λμ€λ₯Ό μ¬μ©ν΄μΌ νλ€.
[JAVA] β BigInteger & BigDecimal μ¬μ©λ² π― μ΄μ 리
BigInteger μλ£ν BigIntegerλ μΈμ μ¬μ©λλκ° Type λ²μ int -2,147,483,648 ~ 2,147,483,647 long -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 μλ°μ intλ λ©λͺ¨λ¦¬ ν¬κΈ°λ 4byteλ‘ ννν μ..
inpa.tistory.com
// BigDecimal μλ£νμ μ¬μ©
BigDecimal bigNumber1 = new BigDecimal("1000.0");
BigDecimal bigNumber2 = new BigDecimal("999.9");
BigDecimal result2 = bigNumber1.subtract(bigNumber2); // bigNumber1 - bigNumber2
System.out.println(result2); // 0.1
BigDecimalλ₯Ό μ¬μ©ν κ²½μ° κΈ°λ³Έν νμ λ³΄λ€ μ¬μ©νκΈ° λΆνΈνκ³ μ€ν μλκ° λλ €μ§λ€λ λ¨μ μ΄ μλ€. νμ§λ§ μμλ₯Ό κ³μ°ν¨μ μμ΄μ νμλ‘ μμ£Ό μ΄μ©λλ ν΄λμ€μ΄λ λ°λμ μ΅νκΈ°λ₯Ό κΆνλ€.
doubleκ³Ό floatμ λΉκ΅μ°μ° λ¬Έμ
μ€μλ₯Ό λνκ±°λ λΉΌλ κ³μ°μ λν μ€μ°¨λ ν΄κ²°νμ§λ§ ν κ°μ§ λ λ¬Έμ μ μ΄ μ‘΄μ¬νλ€.
μλ°μ floatλ 4λ°μ΄νΈ μ€μ, doubleμ 8λ°μ΄νΈ μ€μ κ°μ μ μ₯ ν μ μλλ°, λ¬Έμ λ μ»΄ν¨ν°λ λΆλ μμμ μΌλ‘ μ€μλ₯Ό νννκΈ° λλ¬Έμ doubleμ float κ°μ μ λ°λ(μ νλ) μ°¨μ΄κ° λ°μνλ€λ μ μ΄λ€.
System.out.println(1.0 == 1.0f); // κ²°κ³Ό : true
System.out.println(1.1 == 1.1f); // κ²°κ³Ό : false
System.out.println(0.1 == 0.1f); // κ²°κ³Ό : false
System.out.println(0.9 == 0.9f); // κ²°κ³Ό : false
System.out.println(0.01 == 0.01f); // κ²°κ³Ό : false
μ μ½λλ₯Ό 보면 λ€ trueμΌ κ²μ΄λΌ μ°©κ° νκΈ° μ½λ€. νμ§λ§ κ²°κ³Όλ 맨 μμ€λ§ μ μΈνκ³ λͺ¨λ falseλ₯Ό μΆλ ₯νλ€.
λμ 보μ΄μ§λ μμ§λ§ λ°λ‘ floatμ doubleμλ£νμ μ€μ ννμ μ λ°λμ μ°¨μ΄κ° λ°μνκΈ° λλ¬Έμ΄λ€.
λ°λΌμ doubleκ³Ό floatκ°μ λΉκ΅ ν λμλ λͺ¨λ floatλ‘ νλ³ν νκ±°λ μ μλ‘ λ³ννμ¬ λΉκ΅ν΄μΌ νλ€.
System.out.println((float)1.1 == 1.1f); // κ²°κ³Ό : true
System.out.println(0.1f == (double)0.1f); // κ²°κ³Ό : true
System.out.println(0.1 == (double)0.1f); // κ²°κ³Ό : false
μ£Όμ ν μ μ (double)0.1f μ°μ°μμ doubleμ 곡κ°μ floatμ μ λ°λλ₯Ό κ°λ κ°μ΄ μ μ₯λ λΏμ΄λΌμ doubleνμ 0.1κ³Ό λΉκ΅ν΄λ κ²°κ³Όκ° trueλ‘ λμ€μ§ μλ λ€λ μ μ΄λ€.
# μ°Έκ³ μλ£
https://velog.io/@maketheworldwise/float-double-%EB%B6%80%EB%8F%99%EC%86%8C%EC%88%98%EC%A0%90
μ΄ κΈμ΄ μ’μΌμ ¨λ€λ©΄ ꡬλ & μ’μμ
μ¬λ¬λΆμ ꡬλ
κ³Ό μ’μμλ
μ μμκ² ν° νμ΄ λ©λλ€.