, νμ λμ΄κ°λ μ°μ°μ λν΄ μ΄λ»κ² μ²λ¦¬νλ κ²μ΄ μ’μκΉ? κ°μ₯ ν° μ μν νμ μΈ μ 10μ§μλ‘ 19μ리μ΄λ€. νμ§λ§, κ°λ μ΄λ³΄λ€ λ ν° κ°μ λ€λ€μΌ ν λκ° μλ€. μ΄λ΄ λλ μλμ κ°μ΄,
λ κ°μ§μ λ°©λ²μ΄ μλ€. μ΄ λ¬Έμμμλ λ λ²μ§Έ λ°©λ²μΈ BigInteger ν΄λμ€, κ·Έλ¦¬κ³ μμ«μ κ³μ°μ λν΄ λΉμ·ν μνμ νλ BigDecimal ν΄λμ€μ λν΄ μ΄ν΄λ³Έλ€.
BigInteger ν΄λμ€λ λ΄λΆμ μΌλ‘ int λ°°μ΄μ ννλ‘ μ΄λ£¨μ΄μ Έ μκΈ° λλ¬Έμ long νμ λ³΄λ€ ν¨μ¬ ν° κ°μ ννν μ μλ€. 10μ§μλ‘λ 10μ 6μ΅ μ κ³±λ§νΌμ ννν μ μλ€.
final int signum; // λΆνΈ
final int[] mag; // κ°
BigInteger num = new BigInteger("123");
BigInteger num = new BigInteger("FFFF", 16);
BigInteger num = BigInteger.valueOf(123L);
λ΄λΆμ μΌλ‘ Integer μΌλ‘ ν μ μλ λͺ¨λ μ°μ°μμ λλΆμ΄ μ°μ°, μ°μ°, μμνλ³ λ± μΆκ°μ μΌλ‘ μ μ©ν λ©μλλ₯Ό μ 곡νλ€.
BigInteger test0 = BigInteger.valueOf(1);
BigInteger test1 = test0.add(new BigInteger("2")); // 3
BigInteger test2 = test0.subtract(new BigInteger("2")); // -1
BigInteger test3 = test0.multiply(new BigInteger("2")); // 2
BigInteger test4 = test0.divide(new BigInteger("2")); // 0
BigInteger test4 = test0.remainder(new BigInteger("2")); // 1
μμ μ½λμμ κ°λ¨ν μ¬μΉμ°μ° μμ λ₯Ό λ€λ£¨λλ°, μΆκ°μ μΌλ‘ String μ²λΌ Immutable νλ€λ κ²μ μ μ μλ€. κ·Έ λ§μ μ¦μ¨, ν λ² μΈμ€ν΄μ± λκ³ λλ©΄ κ·Έ κ°μ λ°κΏμκ° μκ³ , μ°μ° λ°ν νμ μΌλ‘ μλ‘μ΄ μΈμ€ν΄μ€κ° λ°νλλ€.
, , , κ³Ό κ°μ κΈ°λ³Έ λΉνΈ μ°μ° μ΄μΈμλ λΉνΈ κ΄λ ¨ν΄μ μ μ©ν λ©μλλ₯Ό λ§μ΄ μ 곡νλ€. λΉμ°νκ²λ μ°μ°λ³΄λ€ μκ°μ΄ μ€λ 걸리기 λλ¬Έμ μλμ λ©μλλ€μ μ νμ©νλ©΄ μ±λ₯ ν₯μμ λμμ΄ λλ€.
int bitCount()
: 2μ§μλ‘ νννμ λ μμλ 1μ κ°μ, μμλ 0μ κ°μλ₯Ό λ°νint bitLength()
: 2μ§μλ‘ νννμ λ νμν λΉνΈ μ boolean testBit(int n)
: μ°μΈ‘μμ n+1λ²μ§Έ λΉνΈκ° 1μΈμ§μ λν μ¬λΆ boolean setBit(int n)
: μ°μΈ‘μμ n+1λ²μ§Έ λΉνΈλ₯Ό 1λ‘ λ³κ²½boolean clearBit(int n)
: μ°μΈ‘μμ n+1λ²μ§Έ λΉνΈλ₯Ό 0λ‘ λ³κ²½boolean flipBit(int n)
: μ°μΈ‘μμ n+1λ²μ§Έ λΉνΈλ₯Ό 0<->1λ‘ λ³κ²½ BigInteger num = BigInteger.valueOf(4); // 100
int oneCount = num.bitCount(); // 1
int bitLength = num.bitLength(); // 3
boolean IsOne = num.testBit(2); // true
μλ‘ λ€μ΄, BigInteger κ° μ§μμμ νμΈνλ €λ©΄ μ μΌ λ§μ§λ§ λΉνΈκ° 0μΈμ§ testBit(0)λ‘ νμΈμ νλ κ²μ΄ λλ¨Έμ§ μ°μ°μ νλ κ²λ³΄λ€ ν¨μ¨μ μΌ κ²μ΄λ€.
BigInteger num = BigInteger.valueOf(4);
String numStr = num.toString(); // "4"
String numStr2 = num.toString(2); // "110"
BigInteger num = BigInteger.valueOf(4);
int intNum = num.intValue(); // 4
int intNum2 = num.intValueExact(); // 4
λ¨, primitive type μΌλ‘ λ³ννλ λ©μλ μ€ suffixλ‘ Exactκ° λΆμ λ©μλλ€μ, λ§€κ° λ³μκ° ν΄λΉ μλ£νμ λ²μλ₯Ό λμ΄κ° μ, ArithmeticException μ λ°μμν¨λ€.
μμ μ΄ν΄λ³Έ BigInteger ν΄λμ€λ μ μνμ λ²μλ₯Ό λμ΄κ°λ κ°μ λν νν λ° μ°μ°μ ν λ μ¬μ©νλ€. λΉμ·νκ² BigDecimal ν΄λμ€λ double μ μ λ°λ(13μ리)λ³΄λ€ λ μ ννκ² κ°μ ννν΄μΌ ν λ μ΄λ€.
private final BigInteger intVal; // μ μ
private final int scale; // μμ«μ μ΄νμ μ리μ
private transient int precision; // μ μ μ 체μ μλ¦Ώμ
λ΄λΆμ μΌλ‘λ μμ κ°μ΄ ꡬμ±λμ΄ μλ€. μλ‘ λ€μ΄μ, 12.34 λΌλ κ°μ BigDecimal λ‘ μΈμ€ν΄μ±νλ€λ©΄,
μ΄λ κ² λ€μ΄κ° κ²μ΄λ€. λ΄λΆμ μΈ μμλ₯Ό μλ κ²μ μ°μ° ν¨μ¨μ±μ μ¬λ¦¬λ κ²μλ λμμ΄ λλ€. μλ‘ λ€μ΄μ, μ΄λ ν μμλ₯Ό 10μΌλ‘ λλλ€κ³ μκ°ν΄λ³΄μ. Divide μ°μ°μ μ¬μ©νλ κ²λ³΄λ€ setScale ν¨μλ₯Ό ν΅ν΄ scaleμ 1 λ리λ κ²μ΄ λ ν¨μ¨μ μ΄λ€.
BigDecimal num = new BigDecimal("1.23");
BigDecimal num = new BigDecimal(1.23); // Unpredictable
BigDecimal num2 = BigDecimal.valueOf(1.23); // κ°λ₯ν μ΄λ κ² μμ±νμ!
BigDecimal dc = new BigDecimal(1.0e-22); // Unpredictable
2μ 3λ²μ μ£Όμν μ μ BigInteger μλ λ€λ₯΄κ² κΈ°λ³Έ νμ μ«μλ‘ μμ±ν μ μμ§λ§, ν΄λΉ κ°μ΄ μ ννκ² λ€μ΄κ° μ§λ μ무λ λͺ¨λ₯Έλ€. μλ‘ λ€μ΄μ 1.23 μ λ£μλλ° 1.230000000000000000013515 μ΄λ°μμ μλμΉ μμ κ°μ΄ λ€μ΄κ° μ μλ€.
μ€μνμμ ν μ μλ κΈ°λ³Έμ μΈ μ°μ°μ BigDecimal ν΄λμ€μμλ ν μ μλ€. μ°μ° κ²°κ³Όμ λ°λΌ, μ λ°λλ₯Ό ν€μΉμ§ μκ² intVal, Scale, Precision μ΄ μ λ°μ΄νΈ λλ€. μλ‘ λ€μ΄μ λΊμ μ νλ€λ©΄ λ νΌμ°μ°μ μ€ μ리μκ° λμ μͺ½μ scale μ μ¬μ©νκ² λλ€.
BigDecimal test0 = new BigDecimal("1.1");
BigDecimal test1 = test0.add(new BigDecimal("0.05")); // 1.15
BigDecimal test2 = test0.subtract(new BigDecimal("0.05")); // 1.05
BigDecimal test3 = test0.multiply(new BigDecimal("2")); // 2.2
λλμ μ μ²λ¦¬νκΈ° μν λ©μλλ λ€μνκ² μλλ°, μ΄λ»κ² λ°μ¬λ¦Ό ν κ²μΈμ§, λͺλ²μ§Έ μ리μμ ν κ²μΈμ§λ₯Ό μ§μ ν μ μλ€.
divide(BigDecimal divisor)
: κΈ°λ³Έ λλμ
divide(BigDecimal divisor, RoundingMode roundingMode)
: λ°μ¬λ¦Ό μ²λ¦¬ λ°©λ² μ§μ κ°λ₯ν λλμ
divide(BigDecimal divisor, int scale, RoundingMode roundingMode)
: λͺλ²μ§Έ μ리μμ μ΄λ»κ² λ°μ¬λ¦Όμ μ²λ¦¬ν κ²μΈμ§ μ§μ κ°λ₯ν λλμ
BigDecimal test0 = new BigDecimal("10.1");
BigDecimal test1 = test0.divide(BigDecimal.valueOf(10), RoundingMode.CEILING);
BigDecimal test2 = test0.divide(BigDecimal.valueOf(10), RoundingMode.FLOOR);
BigDecimal test3 = test0.divide(BigDecimal.valueOf(10), RoundingMode.HALF_UP);
BigDecimal test4 = new BigDecimal("10");
BigDecimal test5 = test4.divide(BigDecimal.valueOf(10), RoundingMode.UNNECESSARY);
CEILING μ μ¬λ¦Ό, FLOOR μ λ΄λ¦Ό, HALF_UP μ 5μ΄μ μ¬λ¦Ό 5λ―Έλ§ λ²λ¦Ό, κ·Έλ¦¬κ³ UNNECESSARY λ λλμ μ κ²°κ³Όκ° λ± λ¨μ΄μ§μ§ μμΌλ©΄ μλ¬λ₯Ό λ°ννλ€. μ΄ μΈμλ, λ°μ¬λ¦Όμ μ리 κ°μ΄ μ§μμΈμ§ νμμΈμ§, 6μ΄μ μ¬λ¦Ό 6λ―Έλ§ λ²λ¦Ό λ±μ RoundingMode κ° μ‘΄μ¬νλ€.