programing

Big Decimal을 정수로 변환

goodcopy 2022. 12. 26. 21:27
반응형

Big Decimal을 정수로 변환

Big Decimal을 반환하는 Hibernate 메서드가 있습니다.이 번호를 전달해야 하는 다른 API 메서드가 있는데 Integer를 파라미터로 받아들입니다.두 메서드의 반환 유형 또는 변수 유형을 변경할 수 없습니다.

이제 Big Decimal을 Integer로 변환하고 두 번째 메서드에 전달하려면 어떻게 해야 할까요?

빠져나갈 방법이 있을까요?

전화를 걸면(또는 그냥) 정보가 손실된 경우에도 예외가 발생합니다.그러면 int가 반환되지만 자동 박스로 처리됩니다.

에 더 큰 값이 포함되지 않음을 보증할 수 있습니까?

만약 그렇다면, 다음은 당신의 전화 코드입니다.

Integer.valueOf(bdValue.intValue())

TL;DR

범용 변환 요구에 이 중 하나를 사용합니다.

//Java 7 or below
bigDecimal.setScale(0, RoundingMode.DOWN).intValueExact()
//Java 8    
bigDecimal.toBigInteger().intValueExact()

추리

그 대답은 요건이 무엇이고 이러한 질문에 어떻게 대답하느냐에 따라 달라집니다.

  • BigDecimal0 이 、 0 0 、 0 、 0 、 0 、 ?
  • BigDecimal 않을 이 있다Integer 범위?
  • 0이 아닌 부분 부품을 반올림하시겠습니까, 아니면 잘라내시겠습니까?
  • 0이 아닌 부분 부분을 어떻게 반올림하시겠습니까?

에 '라고 대답한 에는 '2번'을 사용하면 .BigDecimal.intValueExact()다른 사람들이 제안했던 것처럼, 그리고 예상치 못한 일이 일어났을 때 폭발하게 놔둬라.

% 2번 문제 100% 자신 없다.intValue()항상 틀린 답입니다.

개선

다른 답변을 바탕으로 다음 가정을 사용해보겠습니다.

  • intValueExact() 자동제어도 .
  • 우리는 예외조항을 적용하길 원한다BigDecimal보다 Integer했을 때 에 대한 한 다른 수 때문입니다.range는 다음과 같습니다.

패러머를 하면, 「 」는 「 」입니다.intValueExact()부분적인 부분이 0이 아닌 경우 예외를 발생시킵니다. 반,는intValue()가 해야 할 BigDecimal무무큽큽큽큽큽

한다.BigDecimal먼저 변환합니다.이렇게 하면 반올림 프로세스를 더 잘 제어할 수 있다는 이점도 있습니다.

스팍 그루비 테스트

void 'test BigDecimal rounding'() {
    given:
    BigDecimal decimal = new BigDecimal(Integer.MAX_VALUE - 1.99)
    BigDecimal hugeDecimal = new BigDecimal(Integer.MAX_VALUE + 1.99)
    BigDecimal reallyHuge = new BigDecimal("10000000000000000000000000000000000000000000000")
    String decimalAsBigIntString = decimal.toBigInteger().toString()
    String hugeDecimalAsBigIntString = hugeDecimal.toBigInteger().toString()
    String reallyHugeAsBigIntString = reallyHuge.toBigInteger().toString()

    expect: 'decimals that can be truncated within Integer range to do so without exception'
    //GOOD: Truncates without exception
    '' + decimal.intValue() == decimalAsBigIntString
    //BAD: Throws ArithmeticException 'Non-zero decimal digits' because we lose information
    // decimal.intValueExact() == decimalAsBigIntString
    //GOOD: Truncates without exception
    '' + decimal.setScale(0, RoundingMode.DOWN).intValueExact() == decimalAsBigIntString

    and: 'truncated decimal that cannot be truncated within Integer range throw conversionOverflow exception'
    //BAD: hugeDecimal.intValue() is -2147483648 instead of 2147483648
    //'' + hugeDecimal.intValue() == hugeDecimalAsBigIntString
    //BAD: Throws ArithmeticException 'Non-zero decimal digits' because we lose information
    //'' + hugeDecimal.intValueExact() == hugeDecimalAsBigIntString
    //GOOD: Throws conversionOverflow ArithmeticException because to large
    //'' + hugeDecimal.setScale(0, RoundingMode.DOWN).intValueExact() == hugeDecimalAsBigIntString

    and: 'truncated decimal that cannot be truncated within Integer range throw conversionOverflow exception'
    //BAD: hugeDecimal.intValue() is 0
    //'' + reallyHuge.intValue() == reallyHugeAsBigIntString
    //GOOD: Throws conversionOverflow ArithmeticException because to large
    //'' + reallyHuge.intValueExact() == reallyHugeAsBigIntString
    //GOOD: Throws conversionOverflow ArithmeticException because to large
    //'' + reallyHuge.setScale(0, RoundingMode.DOWN).intValueExact() == reallyHugeAsBigIntString

    and: 'if using Java 8, BigInteger has intValueExact() just like BigDecimal'
    //decimal.toBigInteger().intValueExact() == decimal.setScale(0, RoundingMode.DOWN).intValueExact()
}

다음 번호로 연락주세요.

이 Big Decimal을 int로 변환합니다.이 변환은 Java Language Specification에서 정의된 대로 더블에서 쇼트로의 원시 변환이 좁혀지는 것과 유사합니다.이 BigDecimal의 프랙셔널 부분은 폐기됩니다.또한 "BigInteger"가 너무 커서 int에 들어가지 않을 경우 하위 32비트만 반환됩니다.이 변환으로 인해 이 Big Decimal 값의 전체 크기와 정밀도에 대한 정보가 손실될 수 있으며 반대 기호가 있는 결과가 반환될 수 있습니다.

그 후, 명시적으로 콜 할 수 있습니다.Integer.valueOf(int)최신 버전의 Java 를 사용하고 있는 경우는, 자동 박스를 사용해 주세요.

다음과 같은 것이 효과적입니다.

BigDecimal d = new BigDecimal(10);
int i = d.intValue();

BigInteger#intValue()를 호출해 보셨습니까?

Big Decimal #int Value() 참조

저는 위의 내용이 통하지 않는다는 것을 알았습니다.JTable에서 셀 값을 가져오고 있었는데 double이나 int 등으로 캐스트할 수 없었습니다.솔루션:

Object obj = getTable().getValueAt(row, 0);

여기서 행 0은 항상 숫자입니다.아직 스크롤 중인 사용자에게 도움이 되길 바랍니다!

언급URL : https://stackoverflow.com/questions/4043579/converting-bigdecimal-to-integer

반응형