Rumah > pangkalan data > tutorial mysql > Mengapa Bahagian Integer PostgreSQL Mengembalikan Keputusan yang Salah?

Mengapa Bahagian Integer PostgreSQL Mengembalikan Keputusan yang Salah?

Linda Hamilton
Lepaskan: 2024-12-27 22:58:12
asal
326 orang telah melayarinya

Why Does PostgreSQL Integer Division Return Incorrect Results?

Isu Pembahagian dalam PostgreSQL: Mengapa Bahagian (/) Mengembalikan Keputusan Salah

Apabila cuba mengira bahagian dengan lajur integer dalam PostgreSQL, pengguna boleh menemui hasil yang tidak dijangka. Pertimbangkan senario berikut:

Masalah:

Jadual bernama "perisian" mengandungi lajur "dev_cost" dan "sell_cost". Anda ingin menentukan kuantiti perisian yang perlu dijual untuk memulihkan dev_cost. Memandangkan "dev_cost" ialah 16000 dan "sell_cost" ialah 7500, anda menjangkakan hasilnya ialah 3. Walau bagaimanapun, pertanyaan

select dev_cost / sell_cost from software;
Salin selepas log masuk

mengembalikan 2 sebaliknya.

Sebab:

PostgresSQL melaksanakan pembahagian integer, yang memotong keputusan ke arah sifar. Oleh kerana kedua-dua "dev_cost" dan "sell_cost" ditakrifkan sebagai integer, hasilnya dipotong kepada 2.

Penyelesaian:

Untuk mendapatkan hasil yang betul, sekurang-kurangnya satu operan mesti dibuang ke jenis titik terapung, seperti apungan atau perpuluhan. Ini boleh dicapai menggunakan fungsi cast() atau dua titik bertindih :: operator:

select cast(dev_cost as decimal) / sell_cost from software;
Salin selepas log masuk

atau

select dev_cost::decimal / sell_cost from software;
Salin selepas log masuk

Sebagai alternatif, anda boleh membulatkan hasil kepada integer terdekat menggunakan siling() fungsi:

select ceil(dev_cost::decimal / sell_cost) from software;
Salin selepas log masuk

Demo:

[SQLFiddle demo](https://www.sqlfiddle.com/#!17/23da8/1)

Atas ialah kandungan terperinci Mengapa Bahagian Integer PostgreSQL Mengembalikan Keputusan yang Salah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan