Decimal

Reprezentacja wartości dziesiętnej, np.2,5. Klienty mogą konwertować wartości na natywne formaty dziesiętne języka, np. Java [BigDecimal][] czy [decimal.Decimal][] języka Java.

[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

Zapis JSON
{
  "value": string
}
Pola
value

string

Wartość dziesiętna jako ciąg znaków.

Reprezentacja ciągu składa się z opcjonalnego znaku: + (U+002B) lub - (U+002D), po którym następuje sekwencja z zerem lub większą liczbą cyfr dziesiętnych („liczba całkowita”), opcjonalnie część ułamkowa, po której następuje wykładnik. Pusty ciąg powinny być interpretowane jako 0.

Ułamek dziesiętny składa się z 0 lub większej liczby cyfr. Ciąg musi zawierać co najmniej jedną cyfrę w postaci liczby całkowitej lub ułamka. Liczba utworzona przez znak, liczba całkowita i ułamek są określane jako istotność.

Wykładnik składa się ze znaku e (U+0065) lub E (U+0045), po którym następuje co najmniej jedna cyfra dziesiętna.

Usługi powinny normalizować wartości dziesiętne przed ich zapisaniem przez:

  • Usunięcie wyraźnie wskazanego znaku + (+2.5 -> 2.5).
  • Zastąpienie liczby całkowitej o zerowej długości 0 (.5 -> 0.5).
  • Przekształć znak wykładnika we wielkie litery, używając jawnego znaku (2.5e8 -> 2.5E+8).
  • usunięcie wyraźnie podanego wykładnika zerowego (2.5E0 -> 2.5);

Usługi mogą wykonywać dodatkową normalizację na podstawie własnych potrzeb i wybranych wewnętrznie implementacji wartości dziesiętnych, np. przesunięcia przecinka i wartości wykładnika razem (np. 2.5E-1 <-> 0.25). Usługi mogą też utrzymywać na końcu zer, aby pokazać większą precyzję, ale nie jest to wymagane.

Pamiętaj, że do dzielenia liczby całkowitej i ułamka można używać tylko znaku .. Parametr , nie powinien być obsługiwany niezależnie od języka. Dodatkowo separatory tysięcy nie powinny być obsługiwane. Jeśli usługa obsługuje te wartości, muszą one być znormalizowane.

Gramatyka 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' };

Usługi powinno jasno udokumentować zakres obsługiwanych wartości, maksymalną obsługiwaną dokładność (łączną liczbę cyfr) i, w odpowiednich przypadkach, skalę (liczbę cyfr po separatorze dziesiętnym) oraz sposób jej zachowania w przypadku odbierania wartości spoza zakresu.

Usługi mogą akceptować wartości przekazywane jako dane wejściowe, nawet jeśli wartość ma większą precyzję lub skalę niż obsługiwana przez usługę, i powinna je zaokrąglić, aby pasowało do obsługiwanej skali. W przypadku utraty dokładności może wystąpić błąd usługi 400 Bad Request (INVALID_ARGUMENT w gRPC).

Usługi powinny otrzymać błąd w postaci 400 Bad Request (INVALID_ARGUMENT w gRPC), jeśli usługa odbiera wartość spoza obsługiwanego zakresu.