본문 바로가기

✏️/Flutter

[flutter] dart packages - Decimal (intro, json serialize)

728x90

https://pub.dev/packages/decimal

 

decimal | Dart Package

The decimal package allows you to deal with decimal numbers without losing precision.

pub.dev

 

오늘 이야기 할 내용은, dart의 패키지 중 하나인 Decimal에 관한 것이다.

이야기에 앞서, dart에서 숫자를 표현하는 자료형은 dart core 라이브러리에 num / int / double 이렇게 있고, num 자료형이 숫자를 나타내는 최상위 자료형이다. 
(* https://www.tutorialspoint.com/dart_programming/dart_programming_numbers.htm)

그렇다면, decimal 패키지가 왜 있고, 언제 사용해야 할까?

decimal 패지키의 홈페이지를 확인해보면 다음과 같이 설명 되어 있다.

This project enable to make computations on decimal numbers without loosing precision like double operations.

해석해보면, 정밀한 계산(또는 저장)을 해야 할 때 사용한다는 것이다.

double 형의 경우 소수점을 담는 가장 큰 타입인데, 계산 시 소수점의 정밀도에 한계가 있다. 내부적으로 숫자를 저장할 때 이진수의 근사치를 저장하기 때문이다.

따라서, 화폐 같이 정확한 계산을 할 때 Decimal 패키지를 사용하여 계산하는데, Decimal 형태로 서버에서 값을 받으려고 할 경우, json serialize를 할 때 다음과 같은 오류가 발생한다.

오류를 살펴보면, Decimal 타입을 json serializing을 지원하지 않으니 jsonConverter 또는 jsonKey를 사용하라는 이야기임을 알 수 있다.

나의 경우, JsonKey를 사용하여 Decimal 타입을 명확하게 지정해서 해결해보았다.

 @JsonKey(
    name: "typeDecimal", // 필드 이름
    fromJson: _decimalFromJson,
    toJson: _decimalToJson,
  )
  Decimal typeDecimal;
  
  static Decimal _decimalFromJson(input) => Decimal.parse(input);
  static String _decimalToJson(input) => input.toString(); // String 형태로 서버 보내기 

코드를 하나씩 살펴보면, 해당 필드를 JsonKey를 통해 fromJson과 toJson을 직접 지정하여 해결하였다.
_decimalFromJson 메소드의 경우 Decimal.parse를 통해 json으로부터 온 값을 Decimal 타입으로 받고,
_decimalToJson 메소드의 경우 Decimal 타입의 값을 문자열로 보낸다는 것이다. (이 부분은 서버 쪽 받는 값에 따라 toInt, toString, toDouble 등 적절히 선택하면 될 듯하다!)

 

--

참고 한 곳
https://github.com/google/json_serializable.dart/issues/51