Decimal

小数值的表示形式,例如 2.5。客户端可能会将值转换为语言原生的小数格式,例如 Java 的 BigDecimal 或 Python 的 decimal.Decimal

JSON 表示法
{
  "value": string
}
字段
value

string

以字符串形式表示的小数值。

字符串表示形式由一个可选符号(+ [U+002B] 或 - [U+002D])、后跟零个或多个十进制数字(“整数”)、后跟一个可选的小数、后跟一个可选的指数组成。空字符串解读为 0

小数部分由一个小数点后跟零个或多个十进制数字组成。字符串必须在整数或分数中包含至少一个数字。由符号、整数和分数组成的数字称为有效数。

指数由字符 e (U+0065) 或 E (U+0045) 后跟一个或多个十进制数字组成。

服务在存储小数数值之前对其进行归一化处理,方法如下:

  • 移除了明确提供的 + 符号 (+2.5 -> 2.5)。
  • 将零长度的整数值替换为 0.5 -> 0.5)。
  • 强制将指数字符转换为大写,并带有明确的符号 (2.5e8 -> 2.5E+8)。
  • 移除了明确提供的零指数(2.5E0 -> 2.5)。

服务可能会根据自身需求和所选的内部小数实现方式执行额外的归一化,例如同时移动小数点和指数值(示例:2.5E-1 <-> 0.25)。此外,服务可能会保留小数部分末尾的零以指示更高的精度,但并非必须这样做。

请注意,仅支持使用 . 字符分隔整数和小数;无论使用何种语言区域,, 都不应受支持。此外,不应支持千位分隔符。如果某项服务支持这些值,则这些值必须进行标准化处理。

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)。