🔢

JSON・TOML・YAMLの数値型の違い

2024/06/04に公開

はじめに

JSON・TOML・YAMLの仕様を見ていたら数値型に結構違いがあるように思ったのでまとめてみました。

この記事ではそれぞれのファイルフォーマットの最新の仕様を対象とします。

JSON

JSONのNumber型(数値型)はJavaScriptの数値型と同じくすべての数値が浮動小数点数として扱われます。
JavaScriptでは数値型の精度はIEEE 754の倍精度浮動小数点数(binary64)と定められていますが、JSONの数値型の精度は処理系依存です[1]

JavaScript(ES2021)の数値型との主な違いは次の通りです。

  1. 10進数表記だけ対応。
  2. 数値の前に+を付けられない。
  3. NaNInfinity-Infinityには対応していない。
  4. _で数値を区切ることはできない。
number.json
{
  "integer": 42,
  "float": 3.14,
  "exponent": 5E+22
}

TOML

整数型

TOMLの整数型は64ビット符号付き整数型です。

主な仕様は次の通りです。

  1. 数値を_で区切ることができる。
  2. 正の数のときは{2,8,16}進数表記が使える。
integer.toml
positive = 42
zero = 0
negative = -17

hex = 0xdead_beef
oct = 0o755
bin = 0b11010110

浮動小数点型

TOMLの浮動小数点型はIEEE 754の倍精度浮動小数点数(binary64)です。

float.toml
positive = 3.14
negative = -0.01

exponent = 5e+22

infinity = inf

not-a-number = nan

YAML

整数型

YAMLの整数型は多倍長整数です。

integer.yaml
positive: 34
zero: 0
negative: -12

hex: 0xDEADBEEF
oct: 0o755

YAML 1.1との違い

YAML 1.1からYAML 1.2では数値の表記関連でいくつか破壊的変更が行われています。

  1. 数値を_で区切ることができなくなった。
  2. 8進数表記の接頭辞が0から0oに変更された。010は8ではなく10と解釈されるようになった。
  3. 2進数表記と60進数表記が削除された。

浮動小数点型

YAMLの浮動小数点型の精度は処理系依存です。

float.yaml
positive: 3.14
negative: -0.01

exponent: 2.3e4

infinity: .inf

not-a-number: .nan

まとめ

整数

JSON TOML YAML
サイズ 処理系依存 64ビット 処理系依存
符号
先頭のプラス記号
先行ゼロ
アンダースコアで桁区切り
2進数表記
8進数表記
16進数表記

浮動小数点数

JSON TOML YAML
精度 処理系依存 binary64 処理系依存
先頭のプラス記号
先行ゼロ
アンダースコアで桁区切り
指数表記
無限大
NaN

参考文献

脚注
  1. 仕様ではbinary64として扱うことで良好な相互運用性を実現できると述べられています。 ↩︎

GitHubで編集を提案

Discussion