Fungsi ROUND membulatkan nilai input sesuai jumlah tempat desimal yang ditentukan. Topik ini menjelaskan masalah presisi fungsi ROUND serta menyediakan solusi dan contoh untuk referensi.
Contoh
Hasil yang dikembalikan oleh fungsi ROUND dalam kode SQL tidak sesuai dengan harapan. Contoh pernyataan:
select round(0.25375,4);Hasil yang diharapkan adalah 0.2538 berdasarkan logika fungsi ROUND. Namun, nilai input tidak dibulatkan ke atas, sehingga menghasilkan 0.2537.
Penyebab
MaxCompute mengonversi nilai input fungsi ke tipe DOUBLE sebelum eksekusi. Selama konversi tipe data, terjadi kehilangan presisi. Akibatnya, hasil yang dikembalikan oleh fungsi ROUND menjadi tidak akurat. Dalam contoh ini, 0.25375 dikonversi menjadi 0.2536999999..., sehingga menghasilkan 0.2537.
Saat menggunakan fungsi ROUND untuk memproses data dalam tabel, tipe data aktual dari bidang tabel dibaca. Dalam hal ini, masalah presisi tidak akan terjadi.
Solusi
Untuk memastikan presisi nilai input, gunakan fungsi CAST untuk mengonversi nilai input ke tipe DECIMAL. Masalah presisi tidak terjadi pada data bertipe DECIMAL. Contoh pernyataan:
set odps.sql.hive.compatible=false; digunakan:
Hasil yang dikembalikan adalah 0.2538.select round(cast(0.25375 as decimal), 4);
Hasil yang dikembalikan adalah 0.2538.select round(cast(0.25375 as decimal(20,5)), 4);
set odps.sql.hive.compatible=true; digunakan:
Hasil yang dikembalikan adalah 0.select round(cast(0.25375 as decimal), 4);
Hasil yang dikembalikan adalah 0.2538.select round(cast(0.25375 as decimal(20,5)), 4);