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
421 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!

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