Decimal

2.5 などの 10 進数値の表現。クライアントは、値を言語ネイティブの 10 進形式(Java の BigDecimal や Python の decimal.Decimal など)に変換できます。

JSON 表現
{
  "value": string
}
フィールド
value

string

10 進数(文字列)。

文字列の表現は、オプションの符号、+U+002B)または -U+002D)で構成され、その後に 0 個以上の 10 進数のシーケンス(「整数」)が続き、オプションで分数、オプションで指数が続きます。空の文字列は 0 として解釈する必要があります

小数部は、小数点と 0 個以上の 10 進数で構成されます。文字列には、整数または分数のいずれかに少なくとも 1 つの数字が含まれている必要があります。符号、整数、分数で構成される数値を仮数と呼びます。

指数は、文字 eU+0065)または EU+0045)の後に 1 つ以上の 10 進数で構成されます。

サービスは、10 進数値を保存する前に、次の方法で正規化するべきです

  • 明示的に指定された + 記号を削除(+2.5 -> 2.5)。
  • 長さ 0 の整数値を 0 に置き換えます(.5 -> 0.5)。
  • 指数文字を大文字に強制変換し、符号を明示的に指定します(2.5e8 -> 2.5E+8)。
  • 明示的に指定されたゼロ指数を削除(2.5E0 -> 2.5)。

サービスは、独自のニーズと選択された内部 10 進数実装に基づいて、追加の正規化を行うことがあります(小数点と指数値を一緒にシフトするなど(例: 2.5E-1 <-> 0.25))。また、サービスは、精度を高めるために、小数部の末尾のゼロを保持することがありますが、必須ではありません。

整数と小数部を区切るためにサポートされているのは . 文字のみです。ロケールに関係なく、, はサポートされません。また、3 桁ごとの区切り文字はサポートすべきではありません。サービスがサポートしている場合、値は正規化されている必要があります

ENBF 文法は次のとおりです。

DecimalString =
  '' | [Sign] Significand [Exponent];

Sign = '+' | '-';

Significand =
  Digits ['.'] [Digits] | [Digits] '.' Digits;

Exponent = ('e' | 'E') [Sign] Digits;

Digits = { '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' };

サービスは、サポートされている値の範囲、サポートされている最大精度(桁数)、該当する場合はスケール(小数点以下の桁数)、範囲外の値を受信した場合の動作を明確に文書化するべきです

サービスは、値の精度またはスケールがサービスでサポートされているものよりも高い場合でも、入力として渡された値を受け入れることを選択できます。また、サポートされているスケールに合わせて値を丸める必要があります。精度が失われる場合は、サービスが 400 Bad Request(gRPC では INVALID_ARGUMENT)でエラーを返すこともあります

サービスがサポートされている範囲外の値を受け取った場合、サービスは 400 Bad Request(gRPC では INVALID_ARGUMENT)でエラーを返す必要があります