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