item 60 incheol - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
float์ double ํ์ ์ ๊ณผํ๊ณผ ๊ณตํ ๊ณ์ฐ์ฉ์ผ๋ก ์ค๊ณ๋์๋ค. ์ด์ง ๋ถ๋์์์ ์ฐ์ฐ์ ์ฐ์ด๋ฉฐ, ๋์ ๋ฒ์์ ์๋ฅผ ๋น ๋ฅด๊ฒ ์ ๋ฐํ '๊ทผ์ฌ์น'๋ก ๊ณ์ฐํ๋๋ก ์ธ์ฌํ๊ฒ ์ค๊ณ๋์๋ค. ๋ฐ๋ผ์ float๊ณผ double ํ์ ์ ํนํ ๊ธ์ต ๊ด๋ จ ๊ณ์ฐ๊ณผ๋ ๋ง์ง ์๋๋ค.
๋จ์ ๋์ ๊ณ์ฐํด๋ณด์
// Q1. 1.03๋ฌ๋ฌ๊ฐ ์์๋๋ฐ ๊ทธ์ค 42์ผํธ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ผ๋ง๊ฐ ๋จ์์๊น?
System.out.println(1.03 - 0.42);
// result : 0.6.10000000000000001
// Q2. 1๋ฌ๋ฌ๋ก 10์ผํธ์ง๋ฆฌ ์ฌํ 9๊ฐ๋ฅผ ์ด ๊ฒฝ์ฐ์ ์ผ๋ง๊ฐ ๋จ์์๊น?
System.out.println(1.00 - 9 * 0.10);
// result : 0.0999999999999998
๊ธ์ต ๊ณ์ฐ์๋ BigDecimal, int ํน์ long์ ์ฌ์ฉํ๋ผ
๋ค์์ BigDecimal์ ์ฌ์ฉํ ๊ณ์ฐ๋ฒ์ด๋ค.
public static void main(String[] args) {
final BigDecimal TEN_CENTS = new BigDecimal(".10");
int itemsBought = 0;
BigDecimal funds = new BigDecimal("1.00");
for (BigDecimal price = TEN_CENTS; funds.compareTo(price) >= 0; price = price.add(TEN_CENTS)) {
funds = funds.subtract(price);
itemsBought++;
}
System.out.println(itemsBought + "๊ฐ ๊ตฌ์
");
System.out.println("์๋(๋ฌ๋ฌ): " + funds);
}
์ด ํ๋ก๊ทธ๋จ์ ์คํํ๋ฉด ์ฌํ 4๊ฐ๋ฅผ ๊ตฌ์ ํ ํ ์๋์ 0๋ฌ๋ฌ๊ฐ ๋จ๋๋ค.
BigDecimal์๋ ๋จ์ ์ ์๋ค.
- ๊ธฐ๋ณธ ํ์ ๋ณด๋ค ์ฐ๊ธฐ๊ฐ ํจ์ฌ ๋ถํธํ๋ค.
- ํจ์ฌ ๋๋ฆฌ๋ค.
- ๋จ๋ฐ์ฑ์ด๋ผ๋ฉด ๋๋ฆฌ๋ค๋ ๋ฌธ์ ๋ ๋ฌด์ํ ์ ์์ง๋ง, ์ฐ๊ธฐ ๋ถํธํ๋ค๋ ์ ์ ๋ชป๋ด ์์ฌ์ธ ๊ฒ์ด๋ค.
BigDecimal์ ๋์์ผ๋ก int ํน์ long ํ์ ์ ์ฌ์ฉํ๋ผ
int์ long์ ์ฌ์ฉํ์ฌ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ง๋ง ๋ค๋ฃฐ ์ ์๋ ๊ฐ์ ํฌ๊ธฐ๊ฐ ์ ํ๋๊ณ , ์์์ ์ ์ง์ ๊ด๋ฆฌํด์ผ ํ๋ ๋จ์ ์ด ์๋ค. ๋ค์์ ๋ชจ๋ ๊ณ์ฐ์ ๋ฌ๋ฌ ๋์ ์ผํธ๋ก ์ํํ ์ฝ๋์ด๋ค.
public static void main(String[] args) {
int itemsBought = 0;
int funds = 100;
for (int price = 10; funds >= price; price += 10) {
funds -= price;
itemsBought++;
}
System.out.println(itemsBought + "๊ฐ ๊ตฌ์
");
System.out.println("์๋(์ผํธ): " + funds);
}
์ ๋ฆฌ
์ ํํ ๋ต์ด ํ์ํ ๊ณ์ฐ์๋ float๋ double์ ํผํ๋ผ. ์์์ ์ถ์ ์ ์์คํ ์ ๋งก๊ธฐ๊ณ , ์ฝ๋ฉ ์์ ๋ถํธํจ์ด๋ ์ฑ๋ฅ ์ ํ๋ฅผ ์ ๊ฒฝ ์ฐ์ง ์๊ฒ ๋ค๋ฉด BigDecimal์ ์ฌ์ฉํ๋ผ. BigDecimal์ด ์ ๊ณตํ๋ ์ฌ๋ ๊ฐ์ง ๋ฐ์ฌ๋ฆผ ๋ชจ๋๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ฌ๋ฆผ์ ์๋ฒฝํ ์ ์ดํ ์ ์๋ค. ๋ฒ์ผ๋ก ์ ํด์ง ๋ฐ์ฌ๋ฆผ์ ์ํํด์ผ ํ๋ ๋น์ฆ๋์ค ๊ณ์ผ์์ ์์ฃผ ํธ๋ฆฌํ ๊ธฐ๋ฅ์ด๋ค. ๋ฐ๋ฉด, ์ฑ๋ฅ์ด ์ค์ํ๊ณ ์์์ ์ ์ง์ ์ถ์ ํ ์ ์๊ณ ์ซ์๊ฐ ๋๋ฌด ํฌ์ง ์๋ค๋ฉด int๋ long์ ์ฌ์ฉํ๋ผ. ์ซ์๋ฅผ ์๋กญ ์๋ฆฌ ์ญ์ง์๋ก ํํํ ์ ์๋ค๋ฉด int๋ฅผ ์ฌ์ฉํ๊ณ , ์ด์ฌ๋ ์๋ฆฌ ์ญ์ง์๋ก ํํํ ์ ์๋ค๋ฉด long์ ์ฌ์ฉํ๋ผ. ์ด์ฌ๋ ์๋ฆฌ๋ฅผ ๋์ด๊ฐ๋ฉด BigDeciamal์ ์ฌ์ฉํด์ผ ํ๋ค.