JSON number type range

# json number 타입의 값이 커지면 사용하는 프로그램에 따라 값이 달라 질 수 있다.
# 다음과 같은 json_sample.json 이 있을때,
{
    "strval": "ysoftman",
    "intval1": -123456789123456789,
    "intval2": 123456789123456789,
    "intval3": 123456789123456789123456789123456789,
    "floatval1": -1.123456789123456789,
    "floatval2": 1.123456789123456789123456789,
    "floatval3": 1.123456789123456789123456789123456789
}
# JSON number 스펙을 보면 범위에 제한은 없지만
# JSON 을 사용하는 대부분의 프로그램이 IEEE754 64bit 의 범위 제한이 있다.
IEEE754 64bit 표준에 따라

# 2^64(9223372036854775808 ~ 9223372036854775807) 까지 표시할 수 있다.
# 이 범위를 넘어가면 int 타입은 0, float 타입은 범위 내까지만 표현된다.
{
    StrVal: "ysoftman",
    IntVal1: -123456789123456789,
    IntVal2: 123456789123456789,
    IntVal3: 0,
    FloatVal1: -1.1234567891234568,
    FloatVal2: 1.1234567891234568,
    FloatVal3: 1.1234567891234568
}

# jq 도 float 타입은 64bit 범위 까지만 지원한다.
# man jq : jq currently only has IEEE754 double-precision (64-bit) floating point number support 
# 하지만 정수형은 지수 형태로 최대한 표현된다.
# jq  . ./json_sample.json
{
  "strval": "ysoftman",
  "intval1": -123456789123456780,
  "intval2": 123456789123456780,
  "intval3": 1.2345678912345678e+35,
  "floatval1": -1.1234567891234568,
  "floatval2": 1.1234567891234568,
  "floatval3": 1.1234567891234568
}

# javascript JSON.parse() 도 jq 와 같은 결과
floatval1: -1.1234567891234568
floatval2: 1.1234567891234568
floatval3: 1.1234567891234568
intval1: -123456789123456780
intval2: 123456789123456780
intval3: 1.2345678912345678e+35
strval: "ysoftman"

comments:

댓글 쓰기