민프

Bigdecimal을 JSON 문자열로 나타내면 어떨까? 본문

[정보]

Bigdecimal을 JSON 문자열로 나타내면 어떨까?

민프야 2023. 3. 28. 10:34

BigDecimal을 JSON 문자열로 변환하는 것은 가능하지만 주의해야 할 몇 가지 사항이 있다.

 

첫째로, BigDecimal은 정밀도가 높은 실수 값을 나타내는 데 사용되는 클래스인데,

이는 큰 소수나 긴 소수점 이하 자릿수를 가지는 실수 값을 표현하는 데 적합하다.

근데 JSON은 일반적으로 문자열, 숫자, 불리언, 배열, 객체, null 값만 허용하므로 BigDecimal 객체를 JSON으로 직렬화하려면 문자열 형태로 직렬화해야 한다.

 

둘째로, BigDecimal의 직렬화 및 역직렬화는 문제가 될 수 있다.

이유는 BigDecimal은 toString() 메서드를 통해 문자열로 변환되고, 이 문자열은 지수 표기법을 사용하여 대규모 정수 값을 나타낼 수 있다.

이 경우, toString()으로 생성된 문자열은 과학적 표기법으로 인해 JSON 파서가 잘못 해석될 수도 있다.

예를 들어, 1E+20은 Java에서 유효한 십진수 값이지만 JSON 파서에서는 잘못된 형식으로 해석될 수 있다.

쉽게 말해서 BigDecimal 객체에 20자리 소수점이 있고, 이를 JSON 문자열로 직렬화한 다음 다른 시스템에서 다시 BigDecimal 객체로 역직렬화하는 경우, 해당 시스템에서도 20자리 소수점을 지원해야 합니다. 그렇지 않으면 BigDecimal 객체의 값이 손실될 수 있다는 말이다

 

따라서 BigDecimal을 JSON으로 직렬화하기 전에 toPlainString() 메서드를 사용하여 문자열을 얻어야 한다.

아래 메서드는 지수 표기법을 사용하지 않고 일반 십진수 형식으로 숫자 값을 반환하는 방법이다.

그러므로 다음과 같은 코드를 사용하여 BigDecimal을 JSON 문자열로 변환할 수 있습니다.

BigDecimal value = new BigDecimal("123456789.123456789");
String jsonValue = "{\"number\": " + value.toPlainString() + "}";

JSON 형식을 정의하는 대부분의 언어 및 프레임워크에서는, BigDecimal 값을 문자열로 변환하는 라이브러리를 제공하며, 이를 통해 JSON 문자열을 생성할 수 있다.

따라서 BigDecimal 값을 JSON으로 만들어 전송하는 경우, 이러한 주의사항을 고려하여 적절한 처리를 해야 한다.

 

그럼 여기서 

toString()과 toPlanString()은 뭐가 다른 것 일까?

 

toString() 메서드는 BigDecimal 객체를 문자열로 반환한다.

이 문자열은 값의 정확도를 보장하기 위해 지수 표기법(exponential notation)을 사용할 수 있다

예를 들어, BigDecimal("1000000000000000000000")의 경우, toString() 메서드는 "1E+21"과 같은 지수 표기법 문자열을 반환하는 반면에

toPlainString() 메서드는 BigDecimal 객체를 지수 표기법 없이 일반적인 십진수 형식으로 반환하게 된다.

따라서 toPlainString() 메서드를 사용하여 BigDecimal 값을 문자열로 변환하면, 해당 문자열은 지수 표기법을 사용하지 않는 일반적인 십진수 형식으로 표시되게 된다.

예를 들어, BigDecimal("1000000000000000000000")의 경우, toPlainString() 메서드는 "1000000000000000000000"과 같은 문자열을 반환한다.

 

따라서 toString() 메서드는 BigDecimal 값을 보다 간결한 형태로 표현할 수 있지만, 값의 정확도를 보장하기 위해 지수 표기법을 사용할 수 있으므로, 일반적으로 데이터 저장 및 전송에 사용하기에는 적합하지 않을 수 있다. 반면에, toPlainString() 메서드는 지수 표기법 없이 일반적인 십진수 형식으로 값을 표시하므로, 데이터 저장 및 전송에 사용하기에 더 적합하다.

Comments