JavaRush /Java Blog /Random-KO /BigInteger 및 BigDecimal

BigInteger 및 BigDecimal

Random-KO 그룹에 게시되었습니다
Java에서 애플리케이션은 클래스로 구성되고, 클래스는 메소드와 변수로 구성됩니다. 변수는 다시 기본 변수와 참조 변수로 구분됩니다. BigInteger 및 BigDecimal - 1Java에는 8가지 유형의 변수가 있으며, boolean및 를 제외하고 char다음과 같은 유형으로 나뉩니다.
  • 정수 : byte, short및 ;intlong
  • 부동 소수점(실수라고도 함): floatdouble.
이러한 작은 그룹 내에서는 포함될 수 있는 값의 범위에서만 차이가 존재합니다(따라서 그러한 변수가 차지하는 공간도 달라집니다). 정수 유형 중 가장 큰 것은 long범위가 -9223372036854775808에서 9223372036854775807인 입니다. 부동 소수점 숫자 중에서 double범위는 1.7e-308에서 1.7e+308입니다. 이 기사 에서 실수에 대한 자세한 내용을 읽을 수 있습니다 . 하지만 허용 가능한 범위보다 큰 숫자를 저장해야 하는 경우에는 어떻게 해야 할까요? BigInteger이 경우에는 및 가 필요합니다 BigDecimal.

Java의 BigInteger

Java 클래스는 BigInteger64비트의 long 제한이 없는 임의 길이의 정수 값과 유사하게 사용됩니다. Number또한 이는 숫자 단순 유형( Integer, Long, 등) 에 대한 표준 래퍼와 마찬가지로 클래스의 자손 이므로 단순 유형으로 이어지는 메소드 구현 Byte을 갖습니다.Double
BigInteger value = new BigInteger("32145");

int intValue = value.intValue();//32145

long longValue = value.longValue();//32145

double doubleValue = value.doubleValue();//32145.0
BigInteger즉시 우리는 값이 생성자에 전달되지만 문자열 형식인 그러한 객체가 생성되는 것을 볼 수 있습니다 . 그가 한 명 이상의 디자이너를 가지고 있지만 모든 경우에 적용된다는 점은 주목할 가치가 있습니다. 기본 유형이 의 전체 데이터 양을 수용하지 못하는 경우 BigInteger데이터는 해당 기본 유형의 범위로 잘립니다. 그러나 동시에 이러한 메소드( 등)와 유사한 메소드도 있지만 intValueExact()유일한 longValueExact()차이점은 변환이 수행되는 단순 유형이 데이터 범위를 수용하지 않는 경우 ArithmeticException이 발생한다는 것입니다 .

BigInteger 상수

내부 사용을 위해 클래스에는 상수가 있습니다.
BigInteger.ZERO
BigInteger.ONE
BigInteger.TEN
이는 BigInteger각각 , 및 값을 갖는 0상수 1객체 입니다 10.

BigInteger 메서드

이 클래스의 주요 특징 중 하나는 Java에서 표준 산술 연산을 구현하는 메소드로 가득 차 있다는 것입니다. 예를 들어:
  • 합산 연산:

    BigInteger firstValue = new BigInteger("37995");
    BigInteger secondValue = new BigInteger("35466");
    BigInteger resultValue =  firstValue.add(secondValue);//73461
  • 곱셈 연산:

    BigInteger firstValue = new BigInteger("37995");
    BigInteger secondValue = new BigInteger("35466");
    BigInteger resultValue =  firstValue.multiply(secondValue);//1347530670
  • 한 숫자를 다른 숫자로 나눌 때 나머지를 찾는 연산:

    BigInteger firstValue = new BigInteger("37995");
    BigInteger secondValue = new BigInteger("35466");
    BigInteger resultValue =  firstValue.remainder(secondValue);//2529
  • 숫자의 절대값 얻기(즉, 모듈로, 부호 없음):

    BigInteger firstValue = new BigInteger("-37995");
    BigInteger resultValue =  firstValue.abs();//37995
더 복잡한(특정) 작업을 위한 메서드도 있습니다.
  • 모드 계산을 사용한 작업 :

    BigInteger firstValue = new BigInteger("-34");
    BigInteger secondValue = new BigInteger("5");
    BigInteger resultValue = firstValue.mod(secondValue); //1
이 기능에는 여러 가지 변형이 있습니다.
  • 난수를 얻고 결과 값이 사용할 비트 수를 지정합니다.

    BigInteger firstValue = BigInteger.probablePrime(8, new Random());//211
    BigInteger secondValue = BigInteger.probablePrime(16, new Random());//42571
  • 비트 시프트 연산(this >> n)

    왼쪽으로 이동:

    BigInteger firstValue = new BigInteger("5");
    BigInteger firstResultValue = firstValue.shiftLeft(3);//40

    오른쪽으로 이동:

    BigInteger secondValue = new BigInteger("34");
    BigInteger secondResultValue = secondValue.shiftRight(2); //8
물론, 문서 에서 메소드의 전체 목록을 살펴보는 것이 더 좋습니다 . BigInteger 및 BigDecimal - 2

Java의 BigDecimal

임의 길이의 실수가 필요한 경우 Java 클래스가 사용됩니다 BigDecimal. 일반적으로 double더 많은 사용자 정의 옵션을 제공하므로 대신 재정 작업에 사용됩니다. BigInteger및 와 마찬가지로 BigDecimal클래스의 자손 Number이며 객체의 값을 특정 기본 유형으로 반환하는 메서드가 있습니다.
BigDecimal value = new BigDecimal(35563.3);

long longValue = value.longValue();//35563

double doubleValue = value.doubleValue();//35563.3
로 줄여보면 알 수 있듯이 long정수 부분만 남고 소수점 자리는 버려집니다.

BigDecimal 생성자

BigDecimal클래스에는 훨씬 더 다양한 선택 항목이 있으므로 생성자를 자세히 살펴보겠습니다. , int, 심지어 를 전달하여 다양한 방법으로 객체의 값을 설정할 수 있는 생성자 와 이를 허용하는 long생성자 가 있습니다. 생성된 개체의 설정을 지정합니다(반올림 방법, 소수 자릿수). doubleStringBigInteger
BigDecimal firstValue = new BigDecimal("455656.545");//455656.545
여기에서는 모든 것이 명확합니다. 보고 싶은 소수 자릿수와 값을 직접 설정합니다.
BigDecimal secondValue = new BigDecimal(3445.54);//3445.5399999999999636202119290828704833984375
이 생성자의 결과는 매우 예측하기 어려울 수 있습니다. 왜냐하면 우리가 본질적으로 매우 모호한 유형인 double을 지정하기 때문입니다. 따라서 일반적으로 생성자에서 사용하는 것이 좋습니다 String.
BigDecimal thirdValue = new BigDecimal(3445.554645675444, MathContext.DECIMAL32);//3445.555
을 설정 double하지만 동시에 반올림 규칙(소수 자릿수와 반올림 알고리즘 포함)을 설명하는 매개변수도 설정합니다.
char[] arr = new String("455656.545").toCharArray();

BigDecimal fourthValue = new BigDecimal(arr, 2, 6);//5656.5
우리는 객체의 값을 가져오는 요소와 이러한 요소 중 몇 개를 가져오는 문자 배열을 설정합니다.
BigDecimal fifthValue = new BigDecimal(new BigInteger("44554"), 3);//44.554
이미 존재하는 객체를 가져와 BigInteger소수점 이하 자릿수를 설정합니다.

BigDecimal 메서드

클래스에는 BigDecimal다양한 산술 연산을 위한 메서드도 포함되어 있지만 BigInteger. 그럼에도 불구하고 주요 특징은 BigDecimal부동 소수점 숫자 작업의 유연성입니다. 실수를 마스터할 수 있는 능력을 제공하는 몇 가지 기술을 살펴보겠습니다.
  • 정밀도(숫자 수)를 얻습니다.

    BigDecimal value = new BigDecimal("454334.34334");
    int result = value.precision();//11
  • 소수 자릿수와 반올림 규칙을 설정합니다.

    BigDecimal firstValue = new BigDecimal(3445.544445);
    
    BigDecimal secondValue = firstValue.setScale(3,BigDecimal.ROUND_CEILING);//3445.545

    아래에서는 반올림 규칙을 설정하는 상수에 대해 자세히 살펴보겠습니다.

  • 필요한 소수 자릿수와 반올림 규칙을 표시하면서 BigDecimal다른 것으로 나눕니다 .BigDecimal

    BigDecimal firstValue = new BigDecimal("455656.545");
    
    BigDecimal secondValue = new BigDecimal(3445.544445);
    
    BigDecimal result = firstValue.divide(secondValue, 2,RoundingMode.DOWN);//132.24
  • 특정 자릿수만큼 소수점을 오른쪽/왼쪽으로 이동:

    BigDecimal value = new BigDecimal("455656.545");
    BigDecimal firstResult = value.movePointRight (2);//45565654.5
    BigDecimal secondResult = value.movePointLeft (2);//4556.56545
  • 후행 0을 다듬습니다.

    BigDecimal value = new BigDecimal("45056.5000");
    BigDecimal result = value.stripTrailingZeros();//45056.5

    실수 부분에 모두 0이 있고 전체 부분에도 0이 있는 경우(또는 소수 자릿수가 전혀 없는 경우) 다음과 같습니다.

    BigDecimal value = new BigDecimal("450000.000");
    BigDecimal result = value.stripTrailingZeros();//4.5E+5

BigDecimal 반올림 규칙

반올림 규칙을 설정하기 위해 내부에서 BigDecimal반올림 알고리즘을 설명하는 특수 상수를 볼 수 있습니다. ROUND_UP- 0에서 반올림, 실수 부분으로 반올림:
BigDecimal firstValue = new BigDecimal("2.578");
BigDecimal firstResult =  firstValue.setScale(1, BigDecimal.ROUND_UP );//2.6
BigDecimal secondValue = new BigDecimal("-2.578");
BigDecimal secondResult = secondValue.setScale(1, BigDecimal.ROUND_UP );//-2.5
ROUND_DOWN— 0으로 반올림, 즉 실수 부분의 절단:
BigDecimal firstValue = new BigDecimal("2.578");
BigDecimal firstResult =  firstValue.setScale(1, BigDecimal.ROUND_DOWN  );//2.5
BigDecimal secondValue = new BigDecimal("-2.578");
BigDecimal secondResult = secondValue.setScale(1, BigDecimal.ROUND_DOWN  );//-2.6
ROUND_CEILING— 양의 무한대로 반올림합니다. 즉, 숫자가 양수이면 -> ROUND_UP, 음수이면 ->입니다.ROUND_DOWN
BigDecimal firstValue = new BigDecimal("2.578");
BigDecimal firstResult =  firstValue.setScale(1, BigDecimal.ROUND_CEILING);//2.6
BigDecimal secondValue = new BigDecimal("-2.578");
BigDecimal secondResult = secondValue.setScale(1, BigDecimal.ROUND_CEILING);//-2.5
ROUND_FLOOR- 음의 무한대로 반올림합니다. 즉, 숫자가 양수이면 -> ROUND_DOWN, 음수이면 ->ROUND_UP
BigDecimal firstValue = new BigDecimal("2.578");
BigDecimal firstResult =  firstValue.setScale(1, BigDecimal.ROUND_FLOOR);//2.5
BigDecimal secondValue = new BigDecimal("-2.578");
BigDecimal secondResult = secondValue.setScale(1, BigDecimal.ROUND_FLOOR);//-2.6
고려 중인 값에 대해 소수점 이하 자릿수가 잘린 가장 가까운 숫자를 고려 중인 숫자의 가장 가까운 이웃으로 간주합니다. 예를 들어 2.43은 2.5보다 2.4에 더 가깝지만 2.48은 2.5에 더 가깝습니다. ROUND_HALF_DOWN— "가장 가까운 이웃"으로 반올림됩니다. 두 이웃이 특정 값에서 등거리에 있으면 0으로 반올림이 수행됩니다. 예를 들어 등거리는 반올림되는 숫자가 5이고 0과 10의 거리가 같은 경우입니다.
BigDecimal firstValue = new BigDecimal("2.58");
BigDecimal firstResult =  firstValue.setScale(1, BigDecimal.ROUND_HALF_DOWN );//2.6
BigDecimal secondValue = new BigDecimal("2.55");
BigDecimal secondResult = secondValue.setScale(1, BigDecimal.ROUND_HALF_DOWN );//2.5
ROUND_HALF_UP— "가장 가까운 이웃"을 향해 반올림하는 모드입니다. 두 이웃이 등거리이면 반올림이 수행됩니다(학교에서 배운 반올림과 동일함).
BigDecimal firstValue = new BigDecimal("2.53");
BigDecimal firstResult =  firstValue.setScale(1, BigDecimal.ROUND_HALF_UP  );//2.5
BigDecimal secondValue = new BigDecimal("2.55");
BigDecimal secondResult = secondValue.setScale(1, BigDecimal.ROUND_HALF_UP  );//2.6
ROUND_HALF_EVEN— 두 이웃이 등거리에 있지 않으면 "가장 가까운 이웃"으로 반올림됩니다. 이 경우, 반올림되는 숫자 앞에 홀수가 있으면 반올림하고, 짝수이면 내림합니다.
BigDecimal firstValue = new BigDecimal("2222.2225");
BigDecimal secondValue = firstValue.setScale(3,BigDecimal.ROUND_HALF_EVEN );//2222.222
이 결과는 반올림할 때 5가 이전 숫자 2를 보고 짝수인 것을 확인하여 반내림하기 때문에 얻습니다. 그러나 다음과 같은 경우:
BigDecimal firstValue = new BigDecimal("2222.22255");
BigDecimal secondValue = firstValue.setScale(3,BigDecimal.ROUND_HALF_EVEN );//2222.223
마지막 5는 이전 값을 보고 홀수를 확인하므로 반올림은 올라갑니다. 결과적으로 숫자는 6으로 반올림되고 그 다음 6도 반올림됩니다. 그러나 6은 더 이상 왼쪽의 숫자를 보지 않습니다. 왜냐하면 숫자가 확실히 위쪽에 더 가깝고 결과적으로 마지막 2가 1만큼 증가하기 때문입니다. ROUND_UNNECESSARY- 숫자를 반올림할 필요가 없는지 확인하는 데 사용됩니다. 즉, 숫자에 필요한 소수 자릿수가 있는지 확인합니다.
BigDecimal firstValue = new BigDecimal("2.55");
BigDecimal firstResult =  firstValue.setScale(2, BigDecimal.ROUND_UNNECESSARY);//2.55
여기에서는 모든 것이 정상입니다. 값에는 두 자리 숫자가 있으며 소수점 이하 두 자리만 있는지 확인합니다. 그러나 다음과 같은 경우:
BigDecimal secondValue = new BigDecimal("2.55");
BigDecimal secondResult = secondValue.setScale(1, BigDecimal.ROUND_UNNECESSARY);
ArithmeticException그런 다음 테스트되는 값이 지정된 소수 자릿수를 초과하므로 - 를 얻습니다 . 그러나 소수점 이하 두 자리를 확인했지만 실제로 거기에 하나가 있는 경우 예외가 발생하지 않으며 누락된 숫자는 단순히 0으로 보완됩니다.
BigDecimal thirdValue = new BigDecimal("2.5");
BigDecimal thirdResult = thirdValue.setScale(3, BigDecimal.ROUND_UNNECESSARY   );//2.500
BigDecimal또한 y 에는 상수 및 와 유사한 상수가 있다는 BigInteger ZEROONE에 주목하고 싶습니다 TEN. 다음은 문서 에 대한 링크입니다 . 마지막으로, 아시다시피 개체 BigInteger및 로 작업을 수행할 때 BigDecimal이전 개체를 변경하지 않고 항상 새 개체를 얻습니다. immutable즉 , 와 마찬가지로 생성 후에는 변경할 수 없음을 알 수 있습니다 String. 즉, 모든 메소드는 객체의 내부 상태를 변경할 수 없으며 기껏해야 우리가 사용하는 함수에서 지정한 매개변수를 사용하여 새 객체를 반환할 수 있습니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION