Decimal

十进制值的表示,例如 2.5。客户端可以将值转换为语言原生的十进制格式,例如 Java 的 [BigDecimal][] 或 Python 的 [十进制数十进制][]。

[BigDecimal]:https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/math/BigDecimal.html [十进制数]:https://docs.python.org/3/library/dec.html

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