Bagaimana cara mendapatkan hasil float dengan membagi dua nilai integer menggunakan T-SQL?

173

Menggunakan T-SQL dan Microsoft SQL Server saya ingin menentukan jumlah angka desimal ketika saya melakukan pembagian antara 2 angka integer seperti:

select 1/3

Itu saat ini kembali 0. Saya ingin kembali 0,33.

Sesuatu seperti:

select round(1/3, -2)

Tapi itu tidak berhasil. Bagaimana saya bisa mencapai hasil yang diinginkan?

LaBracca
sumber
3
Sudahkah Anda mencoba 1.0 / 3?
Thilo
Jawaban yang saya dapat lebih dari cukup
LaBracca

Jawaban:

277

Saran dari stb dan xiowl baik-baik saja jika Anda mencari konstanta. Jika Anda perlu menggunakan bidang atau parameter yang ada yang merupakan bilangan bulat, Anda dapat menjadikannya sebagai float terlebih dahulu:

SELECT CAST(1 AS float) / CAST(3 AS float)

atau

SELECT CAST(MyIntField1 AS float) / CAST(MyIntField2 AS float)
Richard
sumber
Atau Anda dapat menggunakan mereka sebagai desimal, jika Anda menginginkan hasil desimal.
Tim
30
PILIH 1.0 * MyInt1 / MyInt2
Troglo
@TroubleZero untuk penggunaan MySQLdecimal
itsazzad
terima kasih banyak, kamu menyelamatkan hariku. Saya telah mencoba CAST (7/3 AS mengapung) tetapi kembali 2 lagi. Jadi nomor casting memecahkan masalah saya.
Yasin Yörük
3
tidak perlu memberikan dividen dan pembagi, lihat jawaban @MS ' stackoverflow.com/a/30639343/2866644
robotik
70

Karena SQL Server melakukan pembagian integer. Coba ini:

select 1 * 1.0 / 3

Ini membantu ketika Anda melewatkan bilangan bulat sebagai params.

select x * 1.0 / y
Xiaowl
sumber
1
Anda bahkan dapat meninggalkan nol.
John
43

Tidak perlu membuang keduanya. Jenis data hasil untuk divisi selalu yang dengan tipe data yang lebih tinggi diutamakan . Jadi solusinya harus:

SELECT CAST(1 AS float) / 3

atau

SELECT 1 / CAST(3 AS float)
MS
sumber
27

menggunakan

select 1/3.0

Ini akan melakukan pekerjaan.

stb
sumber
13

Saya mengerti bahwa CASTuntuk FLOATtidak diizinkan di MySQL dan akan memunculkan kesalahan saat Anda berusaha CAST(1 AS float)sebagaimana dinyatakan di MySQL dev .

Solusi untuk ini adalah sederhana. Kerjakan saja

(1 + 0.0)

Kemudian gunakan ROUNDuntuk mencapai jumlah desimal tertentu seperti

ROUND((1+0.0)/(2+0.0), 3)

SQL di atas membagi 1 dengan 2 dan mengembalikan float ke 3 tempat desimal, seperti di dalamnya 0.500.

Satu dapat CASTke jenis berikut: biner, char, tanggal, datetime, desimal, json, nchar, ditandatangani, waktu, dan unsigned .

Dolphin Tertinggi
sumber
3
MySQL memang mengizinkan CAST, hanya saja tidak mengizinkan casting untuk FLOAT. Gunakan DECIMALsebagai gantinya. Lihat misalnya stackoverflow.com/questions/7368163/… .
markusk
7

Sepertinya trik ini berfungsi di SQL Server dan lebih pendek (berdasarkan jawaban sebelumnya)

SELECT 1.0*MyInt1/MyInt2

Atau:

SELECT (1.0*MyInt1)/MyInt2
Troglo
sumber
2
Saya paling suka ini, bahkan terlihat bagus untuk perhitungan persentase:SELECT 100.0 * @Elapsed / @Total
EliSherer
3

Gunakan ini

select cast((1*1.00)/3 AS DECIMAL(16,2)) as Result

Di sini, di sql ini pertama kali dikonversi menjadi float atau dikalikan dengan 1.00. Output yang akan menjadi angka float. Di sini saya mempertimbangkan 2 tempat desimal. Anda dapat memilih apa yang Anda butuhkan.

nazmul.3026
sumber
2

Jika Anda datang ke sini (sama seperti saya) untuk menemukan solusi untuk nilai integer , inilah jawabannya:

CAST(9/2 AS UNSIGNED)

mengembalikan 5

trojan
sumber