Decimal

Uma representação de um valor decimal, como 2,5. Os clientes podem converter valores em formatos decimais nativos da linguagem, como BigDecimal do Java ou decimal.Decimal do Python.

Representação JSON
{
  "value": string
}
Campos
value

string

O valor decimal, como uma string.

A representação de string consiste em um sinal opcional, + (U+002B) ou - (U+002D), seguido por uma sequência de zero ou mais dígitos decimais ("o número inteiro"), opcionalmente seguido por uma fração, opcionalmente seguido por um expoente. Uma string vazia precisa ser interpretada como 0.

A fração consiste em um ponto decimal seguido de zero ou mais dígitos decimais. A string precisa ter pelo menos um dígito na parte inteira ou na fração. O número formado pelo sinal, o inteiro e a fração é chamado de significando.

O expoente consiste no caractere e (U+0065) ou E (U+0045) seguido por um ou mais dígitos decimais.

Os serviços devem normalizar os valores decimais antes de armazená-los:

  • Remover um sinal + fornecido explicitamente (+2.5 -> 2.5).
  • Substituir um valor inteiro de comprimento zero por 0 (.5 -> 0.5).
  • Forçar o caractere de expoente para maiúsculas, com sinal explícito (2.5e8 -> 2.5E+8).
  • Remover um expoente zero fornecido explicitamente (2.5E0 -> 2.5).

Os serviços podem realizar uma normalização adicional com base nas próprias necessidades e na implementação decimal interna selecionada, como mover o ponto decimal e o valor do expoente juntos (exemplo: 2.5E-1 <-> 0.25). Além disso, os serviços podem preservar os zeros à direita na fração para indicar maior precisão, mas não são obrigados a fazer isso.

Observe que apenas o caractere . é compatível para dividir o número inteiro e a fração. , não deve ser compatível, independente da localidade. Além disso, os separadores de milhar não devem ser aceitos. Se um serviço for compatível com eles, os valores precisam ser normalizados.

A gramática 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' };

Os serviços devem documentar claramente o intervalo de valores aceitos, a precisão máxima aceita (número total de dígitos) e, se aplicável, a escala (número de dígitos após o ponto decimal), bem como o comportamento ao receber valores fora dos limites.

Os serviços podem aceitar valores transmitidos como entrada, mesmo que eles tenham uma precisão ou escala maior do que o serviço aceita, e devem arredondar o valor para se adequar à escala aceita. Como alternativa, o serviço pode gerar um erro com 400 Bad Request (INVALID_ARGUMENT no gRPC) se a precisão for perdida.

Os serviços devem gerar um erro com 400 Bad Request (INVALID_ARGUMENT em gRPC) se receberem um valor fora do intervalo compatível.