

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Jenis numerik
<a name="Numeric_types"></a>

Tipe data numerik termasuk bilangan bulat, desimal, dan angka floating-point. 

**Topics**
+ [Jenis bilangan bulat](Numeric_types-integer-types.md)
+ [Jenis DESIMAL atau NUMERIK](Numeric_types-decimal-or-numeric-type.md)
+ [Jenis Floating-point](Numeric_types-floating-point-types.md)
+ [Perhitungan dengan nilai numerik](Numeric_computations.md)

# Jenis bilangan bulat
<a name="Numeric_types-integer-types"></a>

Gunakan tipe data berikut untuk menyimpan seluruh nomor dari berbagai rentang. Anda tidak dapat menyimpan nilai di luar rentang yang diizinkan untuk setiap jenis. 

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/clean-rooms/latest/sql-reference/Numeric_types-integer-types.html)

# Jenis DESIMAL atau NUMERIK
<a name="Numeric_types-decimal-or-numeric-type"></a>

*Gunakan tipe data DECIMAL atau NUMERIK untuk menyimpan nilai dengan presisi yang ditentukan pengguna.* Kata kunci DECIMAL dan NUMERIK dapat dipertukarkan. Dalam dokumen ini, *desimal* adalah istilah yang disukai untuk tipe data ini. Istilah *numerik* digunakan secara umum untuk merujuk pada tipe data integer, desimal, dan floating-point. 

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/clean-rooms/latest/sql-reference/Numeric_types-decimal-or-numeric-type.html)

Tentukan kolom DECIMAL dalam tabel dengan menentukan dan: *precision* *scale* 

```
decimal(precision, scale)
```

 *precision*   
Jumlah total digit signifikan dalam seluruh nilai: jumlah digit di kedua sisi titik desimal. Misalnya, angka tersebut `48.2891` memiliki presisi 6 dan skala 4. Presisi default, jika tidak ditentukan, adalah 18. Presisi maksimum adalah 38.  
 Jika jumlah digit di sebelah kiri titik desimal dalam nilai input melebihi presisi kolom dikurangi skalanya, nilai tidak dapat disalin ke kolom (atau dimasukkan atau diperbarui). Aturan ini berlaku untuk setiap nilai yang berada di luar rentang definisi kolom. Misalnya, rentang nilai yang diizinkan untuk `numeric(5,2)` kolom adalah `-999.99` untuk`999.99`. 

 *scale*   
Jumlah digit desimal di bagian pecahan nilai, di sebelah kanan titik desimal. Bilangan bulat memiliki skala nol. Dalam spesifikasi kolom, nilai skala harus kurang dari atau sama dengan nilai presisi. Skala default, jika tidak ditentukan, adalah 0. Skala maksimum adalah 37.  
Jika skala nilai input yang dimuat ke dalam tabel lebih besar dari skala kolom, nilainya dibulatkan ke skala yang ditentukan. Misalnya, kolom PRICEPAID dalam tabel PENJUALAN adalah kolom DECIMAL (8,2). Jika nilai DECIMAL (8,4) dimasukkan ke dalam kolom PRICEPAID, nilainya dibulatkan ke skala 2.   

```
insert into sales
values (0, 8, 1, 1, 2000, 14, 5, 4323.8951, 11.00, null);

select pricepaid, salesid from sales where salesid=0;

pricepaid | salesid
-----------+---------
4323.90 |       0
(1 row)
```
 Namun, hasil pemeran eksplisit nilai yang dipilih dari tabel tidak dibulatkan.

**catatan**  
Nilai positif maksimum yang dapat Anda masukkan ke dalam kolom DECIMAL (19,0) adalah `9223372036854775807` (2 63 -1). Nilai negatif maksimum adalah`-9223372036854775807`. Misalnya, upaya untuk memasukkan nilai `9999999999999999999` (19 nines) akan menyebabkan kesalahan overflow. Terlepas dari penempatan titik desimal, string terbesar yang AWS Clean Rooms dapat mewakili sebagai angka DESIMAL adalah. `9223372036854775807` Misalnya, nilai terbesar yang dapat Anda muat ke kolom DECIMAL (19,18) adalah. `9.223372036854775807`  
Aturan-aturan ini adalah karena hal-hal berikut:   
Nilai DESIMAL dengan 19 atau kurang digit presisi signifikan disimpan secara internal sebagai bilangan bulat 8-byte.
Nilai DESIMAL dengan 20 hingga 38 digit presisi signifikan disimpan sebagai bilangan bulat 16-byte.

## Catatan tentang menggunakan kolom DESIMAL atau NUMERIK 128-bit
<a name="Numeric_types-notes-about-using-128-bit-decimal-or-numeric-columns"></a>

Jangan sewenang-wenang menetapkan presisi maksimum ke kolom DECIMAL kecuali Anda yakin bahwa aplikasi Anda memerlukan presisi itu. Nilai 128-bit menggunakan ruang disk dua kali lebih banyak daripada nilai 64-bit dan dapat memperlambat waktu eksekusi kueri. 

# Jenis Floating-point
<a name="Numeric_types-floating-point-types"></a>

Gunakan tipe data REAL dan DOUBLE PRECISION untuk menyimpan nilai numerik dengan *presisi variabel*. Jenis ini adalah tipe *yang tidak tepat*, yang berarti bahwa beberapa nilai disimpan sebagai perkiraan, sehingga menyimpan dan mengembalikan nilai tertentu dapat mengakibatkan sedikit perbedaan. Jika Anda memerlukan penyimpanan dan perhitungan yang tepat (seperti untuk jumlah uang), gunakan tipe data DECIMAL.

REAL mewakili format floating point presisi tunggal, menurut IEEE Standard 754 untuk Floating-Point Arithmetic. Ini memiliki presisi sekitar 6 digit, dan kisaran sekitar 1E-37 hingga 1E\$137. Anda juga dapat menentukan tipe data ini sebagai FLOAT4.

DOUBLE PRECISION mewakili format floating point presisi ganda, menurut IEEE Standard 754 untuk Binary Floating-Point Arithmetic. Ini memiliki presisi sekitar 15 digit, dan kisaran sekitar 1E-307 hingga 1E\$1308. Anda juga dapat menentukan tipe data ini sebagai FLOAT atau FLOAT8.

# Perhitungan dengan nilai numerik
<a name="Numeric_computations"></a>

Dalam AWS Clean Rooms, *komputasi* mengacu pada operasi matematika biner: penjumlahan, pengurangan, perkalian, dan pembagian. Bagian ini menjelaskan jenis pengembalian yang diharapkan untuk operasi ini, serta rumus spesifik yang diterapkan untuk menentukan presisi dan skala saat tipe data DECIMAL terlibat. 

Ketika nilai numerik dihitung selama pemrosesan kueri, Anda mungkin mengalami kasus di mana perhitungan tidak mungkin dan kueri mengembalikan kesalahan luapan numerik. Anda mungkin juga mengalami kasus di mana skala nilai yang dihitung bervariasi atau tidak terduga. Untuk beberapa operasi, Anda dapat menggunakan casting eksplisit (jenis promosi) atau parameter AWS Clean Rooms konfigurasi untuk mengatasi masalah ini. 

Untuk informasi tentang hasil perhitungan serupa dengan fungsi SQL, lihat. [AWS Clean Rooms Fungsi Spark SQL](sql-functions-topic-spark.md) 

## Jenis pengembalian untuk perhitungan
<a name="Numeric_computations-return-types"></a>

Mengingat kumpulan tipe data numerik yang didukung AWS Clean Rooms, tabel berikut menunjukkan jenis pengembalian yang diharapkan untuk operasi penambahan, pengurangan, perkalian, dan pembagian. Kolom pertama di sisi kiri tabel mewakili operan pertama dalam perhitungan, dan baris atas mewakili operan kedua. 

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/clean-rooms/latest/sql-reference/Numeric_computations.html)

## Presisi dan skala hasil DECIMAL yang dihitung
<a name="Numeric_computations-precision-and-scale-of-computed-decimal-results"></a>

Tabel berikut merangkum aturan untuk menghitung presisi dan skala yang dihasilkan ketika operasi matematika mengembalikan hasil DECIMAL. Dalam tabel ini, `p1` dan `s1` mewakili presisi dan skala operan pertama dalam perhitungan. `p2`dan `s2` mewakili presisi dan skala operan kedua. (Terlepas dari perhitungan ini, presisi hasil maksimum adalah 38, dan skala hasil maksimum adalah 38.) 

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/clean-rooms/latest/sql-reference/Numeric_computations.html)

Misalnya, kolom PRICEPAID dan KOMISI dalam tabel PENJUALAN keduanya adalah kolom DECIMAL (8,2). Jika Anda membagi PRICEPAID dengan KOMISI (atau sebaliknya), rumusnya diterapkan sebagai berikut: 

```
Precision = 8-2 + 2 + max(4,2+8-2+1)
= 6 + 2 + 9 = 17

Scale = max(4,2+8-2+1) = 9

Result = DECIMAL(17,9)
```

Perhitungan berikut adalah aturan umum untuk menghitung presisi dan skala yang dihasilkan untuk operasi yang dilakukan pada nilai DECIMAL dengan operator yang ditetapkan seperti UNION, INTERSECT, dan EXCEPT atau fungsi seperti COALESCE dan DECODE: 

```
Scale = max(s1,s2)
Precision = min(max(p1-s1,p2-s2)+scale,19)
```

Misalnya, DEC1 tabel dengan satu kolom DECIMAL (7,2) digabungkan dengan DEC2 tabel dengan satu kolom DECIMAL (15,3) untuk membuat tabel. DEC3 Skema DEC3 menunjukkan bahwa kolom menjadi kolom NUMERIK (15,3). 

```
select * from dec1 union select * from dec2;
```

Pada contoh di atas, rumus diterapkan sebagai berikut: 

```
Precision = min(max(7-2,15-3) + max(2,3), 19)
= 12 + 3 = 15

Scale = max(2,3) = 3

Result = DECIMAL(15,3)
```

## Catatan tentang operasi divisi
<a name="Numeric_computations-notes-on-division-operations"></a>

Untuk operasi divisi, divide-by-zero kondisi mengembalikan kesalahan. 

Batas skala 100 diterapkan setelah presisi dan skala dihitung. Jika skala hasil yang dihitung lebih besar dari 100, hasil pembagian diskalakan sebagai berikut:
+ presisi = ` precision - (scale - max_scale)` 
+ Skala = ` max_scale ` 

Jika presisi yang dihitung lebih besar dari presisi maksimum (38), presisi dikurangi menjadi 38, dan skala menjadi hasil dari: `max(38 + scale - precision), min(4, 100))` 

## Kondisi luapan
<a name="Numeric_computations-overflow-conditions"></a>

Overflow diperiksa untuk semua perhitungan numerik. Data DESIMAL dengan presisi 19 atau kurang disimpan sebagai bilangan bulat 64-bit. Data DESIMAL dengan presisi yang lebih besar dari 19 disimpan sebagai bilangan bulat 128-bit. Ketepatan maksimum untuk semua nilai DECIMAL adalah 38, dan skala maksimum adalah 37. Kesalahan overflow terjadi ketika nilai melebihi batas ini, yang berlaku untuk set hasil menengah dan akhir: 
+ Casting eksplisit menghasilkan kesalahan runtime overflow saat nilai data tertentu tidak sesuai dengan presisi atau skala yang diminta yang ditentukan oleh fungsi cast. Misalnya, Anda tidak dapat mentransmisikan semua nilai dari kolom PRICEPAID di tabel PENJUALAN (kolom DECIMAL (8,2)) dan mengembalikan hasil DECIMAL (7,3): 

  ```
  select pricepaid::decimal(7,3) from sales;
  ERROR:  Numeric data overflow (result precision)
  ```

  Kesalahan ini terjadi karena *beberapa* nilai yang lebih besar di kolom PRICEPAID tidak dapat dilemparkan.
+ Operasi perkalian menghasilkan hasil di mana skala hasil adalah jumlah dari skala masing-masing operan. Jika kedua operan memiliki skala 4, misalnya, skala hasilnya adalah 8, hanya menyisakan 10 digit untuk sisi kiri titik desimal. Oleh karena itu, relatif mudah untuk mengalami kondisi luapan ketika mengalikan dua angka besar yang keduanya memiliki skala signifikan.

## Perhitungan numerik dengan tipe INTEGER dan DECIMAL
<a name="Numeric_computations-numeric-calculations-with-integer-and-decimal-types"></a>

Ketika salah satu operan dalam perhitungan memiliki tipe data INTEGER dan operan lainnya adalah DECIMAL, operan INTEGER secara implisit dilemparkan sebagai DECIMAL. 
+ SMALLINT atau SHORT dilemparkan sebagai DECIMAL (5,0) 
+ INTEGER dilemparkan sebagai DECIMAL (10,0) 
+ BIGINT atau LONG dilemparkan sebagai DECIMAL (19,0) 

Misalnya, jika Anda mengalikan SALES.COMMISSION, kolom DECIMAL (8,2), dan SALES.QTYSOLD, kolom SMALLINT, perhitungan ini dilemparkan sebagai: 

```
DECIMAL(8,2) * DECIMAL(5,0)
```