Decimal

Представление десятичного значения, например, 2,5. Клиенты могут преобразовывать значения в десятичные форматы, принятые в языке, например, BigDecimal в Java или decimal.Decimal в Python.

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 ( INVALID_ARGUMENT в gRPC), если точность данных будет потеряна.

Службы должны выдавать ошибку 400 Bad Request ( INVALID_ARGUMENT в gRPC), если служба получает значение за пределами поддерживаемого диапазона.