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.

[Bigdecimal]: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/math/Bigdecimal.html [decimal.decimal]: https://docs.python.org/3/library/decimal.html (em inglês).

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

string

Valor decimal, como uma string.

A representação da 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 e, opcionalmente, um expoente. Uma string vazia precisa ser interpretada como 0.

A fração consiste em um ponto decimal seguido por zero ou mais dígitos decimais. A string precisa conter pelo menos um dígito no número inteiro ou na fração. O número formado pelo sinal, o número inteiro e a fração são chamados de significado.

O expoente é composto pelo caractere e (U+0065) ou E (U+0045) seguido de um ou mais dígitos decimais.

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

  • Remoção de um sinal + fornecido explicitamente (+2.5 -> 2.5).
  • Substituindo um valor inteiro de comprimento zero por 0 (.5 -> 0.5).
  • Força o caractere expoente em letras maiúsculas, com sinal explícito (2.5e8 -> 2.5E+8).
  • Removendo um expoente zero fornecido explicitamente (2.5E0 -> 2.5).

Os serviços podem fazer outras normalizações com base nas próprias necessidades e na implementação decimal interna, como mudar o ponto decimal e o valor expoente juntos (por exemplo: 2.5E-1 <-> 0.25). Além disso, os serviços podem preservar zeros finais na fração para indicar maior precisão, mas não são necessários.

Apenas o caractere . é compatível para dividir o número inteiro e a fração. , não pode ser usado, independentemente da localidade. Além disso, milhares de separadores não devem ser compatíveis. 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 precisam documentar claramente o intervalo de valores compatíveis, 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) e como ele se comporta ao receber valores fora dos limites.

Os serviços podem escolher aceitar valores transmitidos como entrada, mesmo quando o valor tem uma precisão ou escala maiores do que o serviço suporta, e precisam arredondar o valor para se ajustar à escala compatível. Como alternativa, o serviço pode apresentar um erro com 400 Bad Request (INVALID_ARGUMENT em gRPC) se a precisão for perdida.

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