Decimal

Representasi nilai desimal, seperti 2.5. Klien dapat mengonversi nilai ke dalam format desimal native bahasa, seperti [BigDecimal][] Java atau [desimal.Decimal][] Python.

[BigDecimal]: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/math/BigDecimal.html [desimal.Decimal]: https://docs.python.org/3/library/desimal.html

Representasi JSON
{
  "value": string
}
Kolom
value

string

Nilai desimal, sebagai string.

Representasi string terdiri dari tanda opsional, + (U+002B) atau - (U+002D), diikuti dengan urutan nol atau beberapa angka desimal ("bilangan bulat"), secara opsional diikuti oleh pecahan, diikuti oleh eksponen. String kosong harus ditafsirkan sebagai 0.

Pecahan terdiri dari titik desimal yang diikuti nol atau beberapa digit desimal. String harus berisi minimal satu digit dalam bilangan bulat atau pecahan. Angka yang dibentuk oleh tanda, bilangan bulat, dan pecahan disebut sebagai signifikansi.

Eksponen terdiri dari karakter e (U+0065) atau E (U+0045) diikuti dengan satu atau beberapa angka desimal.

Layanan harus menormalkan nilai desimal sebelum menyimpannya dengan:

  • Menghapus tanda + yang diberikan secara eksplisit (+2.5 -> 2.5).
  • Mengganti nilai bilangan bulat nol dengan 0 (.5 -> 0.5).
  • Mengonversi karakter eksponen ke huruf besar, dengan tanda eksplisit (2.5e8 -> 2.5E+8).
  • Menghapus eksponen nol yang disediakan secara eksplisit (2.5E0 -> 2.5).

Layanan dapat melakukan normalisasi tambahan berdasarkan kebutuhannya sendiri dan implementasi desimal internal yang dipilih, seperti menggeser titik desimal dan nilai eksponen bersama-sama (contoh: 2.5E-1 <-> 0.25). Selain itu, layanan dapat mempertahankan angka nol di belakang pecahan untuk menunjukkan peningkatan presisi, tetapi tidak diharuskan untuk melakukannya.

Perlu diketahui bahwa hanya karakter . yang didukung untuk membagi bilangan bulat dan pecahan; , tidak boleh didukung terlepas dari lokalitas. Selain itu, pemisah ribuan tidak boleh didukung. Jika layanan mendukungnya, nilai harus dinormalkan.

Tata bahasa ENBF adalah:

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

Layanan harus mendokumentasikan dengan jelas rentang nilai yang didukung, presisi maksimum yang didukung (jumlah total digit), dan, jika berlaku, skala (jumlah digit setelah titik desimal), serta perilakunya saat menerima nilai di luar batas.

Layanan dapat memilih untuk menerima nilai yang diteruskan sebagai input meskipun nilai memiliki presisi atau skala yang lebih tinggi daripada yang didukung oleh layanan, dan harus membulatkan nilai agar sesuai dengan skala yang didukung. Atau, layanan mungkin mengalami error dengan 400 Bad Request (INVALID_ARGUMENT di gRPC) jika presisi akan hilang.

Layanan harus error dengan 400 Bad Request (INVALID_ARGUMENT di gRPC) jika layanan menerima nilai di luar rentang yang didukung.