全部产品
Search
文档中心

MaxCompute:Memperbaiki masalah presisi fungsi ROUND

更新时间:Jul 02, 2025

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:

Hasil yang dikembalikan saat konfigurasi set odps.sql.hive.compatible=false; digunakan:
  • select round(cast(0.25375 as decimal), 4);
    Hasil yang dikembalikan adalah 0.2538.
  • select round(cast(0.25375 as decimal(20,5)), 4);
    Hasil yang dikembalikan adalah 0.2538.
Hasil yang dikembalikan saat konfigurasi set odps.sql.hive.compatible=true; digunakan:
  • select round(cast(0.25375 as decimal), 4);
    Hasil yang dikembalikan adalah 0.
  • select round(cast(0.25375 as decimal(20,5)), 4);
    Hasil yang dikembalikan adalah 0.2538.