๐ซ ํค์ค์คํฌ ๊ณผ์ ๋ฅผ ๊ตฌํํ๋ฉฐ ๊ฒช์ ๋ฌธ์ ์ ๊ณผ ํด๊ฒฐ๋ฐฉ๋ฒ, ์๋ก ์๊ฒ๋ ์ ์ ๊ธฐ๋กํฉ๋๋ค.
๋งค๋ฒ ์ต๊ด์ฒ๋ผ Double ๋์ BigDecimal์ ์ฌ์ฉํ์ง๋ง, ๊ทธ ์ด์ ๋ฅผ ํ์คํ ์ ๋ฆฌํ์ง ์์๋๋ฐ ์ด๋ฒ ๊ณผ์ ์์ stream์ผ๋ก ๊ตฌํํ์ฌ ๋ฐํ๋ฐ์ ๊ฒฐ๊ด๊ฐ์ ์ค์ฐจ๊ฐ ๋ฐ์ํ์ฌ ์ด๋ฒ ๊ธฐํ์ ์์์ ์ฐ์ฐ์์ ์ BigDecimal์ ์จ์ผ ํ๋์ง ์ ๋ฆฌํด๋ณด์๋ค.
์ฅ๋ฐ๊ตฌ๋์ ๋ด๊ธด ๋ชจ๋ ๋ฉ๋ด์ ์ด ๊ธ์ก์ ์ถ๋ ฅํ๋ ๋ฉ์๋ getTotalPrice()๋ฅผ ๊ตฌํํ๊ณ ์คํ
public double getTotalPrice() {
return cartItems.entrySet().stream()
.mapToDouble(i -> i.getKey().getPrice() * i.getValue())
.sum();
}

13.8 + 8.9 = 22.7 ์ธ๋ฐ, ์ฝ์์ ์ถ๋ ฅ๋ ์ด ๊ธ์ก์ 22.700000000000003 ์ผ๋ก ์ถ๋ ฅ๋์๋ค.
๐ค ์ค์ฐจ๊ฐ ๋ฐ์ํ๋ ์์ธ์ด ๋ฌด์์ผ๊น?
float : ๋๋ต -3.4E38 ~ 3.4E38, 7์๋ฆฌ ์ ๋ฐ๋ (4byte, 2ยณยฒ)double : ๋๋ต -1.7E308 ~ 1.7E308, 15์๋ฆฌ ์ ๋ฐ๋ (8byte, 2โถโด)์ค์ฐจ๋ ์ค์ ์๋ฃํ์ ๋ถ๋์์์ ํํ์ผ๋ก ๋ฐ์ํ๋ค.
๊ณ ์ ์์์ (fixed point)
์ ์๋ฅผ ํํํ๋ ๋นํธ์ ์์๋ฅผ ํํํ๋ ๋นํธ ์๋ฅผ ๋ฏธ๋ฆฌ ๊ณ ์ ํ๊ณ ํด๋น ๋นํธ๋ง์ ํ์ฉํ์ฌ ์ค์๋ฅผ ํํ

๋ถ๋์์์ (floating point, ๆตฎๅ)
'์์์ ์ด ๋ ์ ์์ง์ธ๋ค.' โ ์์์ ์ด ์ฎ๊ฒจ๋ค๋๋ฉฐ ์ค์๋ฅผ ํํ
๋ถ๋์์์ ์ ํํํ๋ ๋ค์ํ ์ฒด๊ณ๊ฐ ์๋ค.
์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ฅ ๋๋ฆฌ ์ฐ์ด๋ ํ์ค์ IEEE 754 ์ด๋ค.
โ๏ธ ์ค์ ์๋ฃํ float, double์ ๊ณ ์ ์์์ ์ ๋นํด์ ๋ ํฐ ๋ฒ์์ ์ค์๋ฅผ ํํํ ์ ์๋ค.
โ int์ float๋4byte๋ก ํฌ๊ธฐ๊ฐ ๋์ผํ์ง๋ง float์ ํํ๋ฒ์๊ฐ ํจ์ฌ ํฌ๋ค.
์ปดํจํฐ๋ ์์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์์๋ฅผ 2์ง๋ฒ์ผ๋ก ํํํ๋๋ฐ ๋ถ๋์์์ ํํ ๋ฐฉ์์ผ๋ก 0.2๋ฅผ ํํํ๋ ๊ฒฝ์ฐ 0.001100110011... ์ ๊ฐ์ด 0011์ด ๋ฌดํ์ผ๋ก ๋ฐ๋ณต๋๋ ์๊ฐ ๋๋ค. ์ด๋ ์ปดํจํฐ๋ 0.2์ ๊ฐ์ด ๋ฌดํ์ผ๋ก ๋ฐ๋ณต๋๋ ์๋ ์ ํํ ๊ฐ์ผ๋ก ์ ์ฅํ์ง ์๊ณ ๊ทผ์ฌ์น๋ก ์ ์ฅํ๋๋ฐ ์ ์ฅ๋ ๊ทผ์ฌ์น๋ก ์ฐ์ฐ์ ํ๋ ๊ฒฝ์ฐ 0.2๊ฐ ์๋ 0.2์ ๊ทผ์ ํ ์๋ก ์ฐ์ฐํ๋ ๊ฒ๊ณผ ๊ฐ์ผ๋ฏ๋ก +,- ์ค์ฐจ๊ฐ ๋ฐ์ํ๋ค.
public class FloatDoubleTest {
public static void main(String[] args) {
// floatํ
float num1 = 0.3f;
float num2 = 0.2f;
System.out.println(num1 - num2); // 0.1
System.out.println(2.0f - 1.1); // 0.9
// doubleํ
double num3 = 2.0;
double num4 = 1.1;
System.out.println(0.3 - 0.2); // 0.1
System.out.println(num3 - num4); // 0.9
}
}

๋ถ๋ณ์ ์์์ ์ ๋ฐ๋ ๋ถํธ๊ฐ ์๋ ์์.
์์์ ์ ๋ฐ๋ ์ ์ ๋น์ค์ผ์ผ ๊ฐ๊ณผ 32๋นํธ ์ ์ ์ค์ผ์ผ๋ก ๊ตฌ์ฑ๋๋ค.
โ ๊ทผ์ฌ๊ฐ์ด ์๋๋ผ ์ ํจ์ซ์์ ์์์ ์ซ์๋ฅผ ๊ธฐ์ค์ผ๋ก ํํํ๋ค.
public BigDecimal getTotalPrice() {
return cartItems.entrySet().stream()
.map(i -> BigDecimal.valueOf(i.getKey().getPrice() * i.getValue()))
.reduce(BigDecimal.ZERO, BigDecimal::add);
}

์์์ ๋จ์์ ์ซ์ ์ฐ์ฐ์ผ๋ก ์ค์ฐจ๊ฐ ๋ฐ์ํ์ฌ ์ซ์์ ๋ฏผ๊ฐํ ๊ธ์ต ๊ฑฐ๋ ํ๋ก๊ทธ๋จ ๋ฑ์ ๊ฐ๋ฐํ ๋ float, double์ ์ฌ์ฉ์ ์ํํ๋ค. ์์์ ์ฐ์ฐ์ด ํ์ํ ๊ฒฝ์ฐ BigDecimal์ ์ฌ์ฉํ์.