T-SQL kullanarak iki tamsayı değeri bölerek bir kayan nokta sonucu nasıl elde edilir?


173

T-SQL ve Microsoft SQL Server kullanarak Aşağıdakiler gibi 2 tam sayı arasında bir ayrım yaptığımda ondalık basamak sayısını belirtmek istiyorum:

select 1/3

Şu anda geri dönüyor 0. Geri dönmek istiyorum 0,33.

Gibi bir şey:

select round(1/3, -2)

Ama bu işe yaramıyor. İstenen sonucu nasıl elde edebilirim?


3
1.0 / 3'ü denediniz mi?
Thilo

Yanıtlar:


277

Bir sabit arıyorsanız stb ve xiowl'den gelen öneriler gayet iyi. Tamsayı olan mevcut alanları veya parametreleri kullanmanız gerekiyorsa, bunları önce kayan sayı olarak atayabilirsiniz:

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

veya

SELECT CAST(MyIntField1 AS float) / CAST(MyIntField2 AS float)

Veya ondalık bir sonuç istiyorsanız, ondalık sayı olarak atayabilirsiniz.
Tim

30
SEÇ 1.0 * MyInt1 / MyInt2
Troglo

MySQL kullanımı için @TroubleZerodecimal
itsazzad

çok teşekkürler, günümü kurtardın. CAST (7/3 AS şamandıra) denendi ama 2 tekrar döndü. Böylece döküm sayılar sorunumu çözdü.
Yasin Yörük

3
temettü ve böleni hem döküm gerek, @MS' cevabı bakın stackoverflow.com/a/30639343/2866644
robotik

70

Çünkü SQL Server tamsayı bölme gerçekleştirir. Bunu dene:

select 1 * 1.0 / 3

Tamsayı parametre olarak ilettiğinizde bu yararlıdır.

select x * 1.0 / y

1
Sıfırları bile bırakabilirsiniz.
John

43

Her ikisini de yayınlamak gerekli değildir. Bir bölümün sonuç veri türü her zaman daha yüksek veri türü önceliğine sahiptir . Bu nedenle çözüm şöyle olmalıdır:

SELECT CAST(1 AS float) / 3

veya

SELECT 1 / CAST(3 AS float)

27

kullanım

select 1/3.0

Bu işi yapacak.


13

Anlıyorum CASTiçin ing FLOATMySQL izin verilmez ve çalıştığınızda bir hata döndürür CAST(1 AS float)de belirtildiği gibi MySQL dev .

Bunun çözümü basittir. Sadece yap

(1 + 0.0)

Ardından ROUND, belirli sayıda ondalık basamağa ulaşmak için

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

Yukarıdaki SQL 1'e 2'yi böler ve olduğu gibi 3 ondalık basamağa döner 0.500.

Bir kutu CAST: Aşağıdaki türlerine ikili, char, tarih, tarih saat, ondalık, json, nchar, imzalı, zaman ve imzasız .


3
MySQL izin veriyor CAST, döküm yapmaya izin vermiyor FLOAT. Cast DECIMALyerine. Bkz. Örneğin stackoverflow.com/questions/7368163/… .
markusk

7

Bu hile SQL Server'da çalışıyor ve daha kısa görünüyor (önceki cevaplara dayanarak)

SELECT 1.0*MyInt1/MyInt2

Veya:

SELECT (1.0*MyInt1)/MyInt2

2
Bunu en çok sevdim, yüzde hesaplamaları için bile güzel görünüyor:SELECT 100.0 * @Elapsed / @Total
EliSherer

3

Bunu kullan

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

Burada bu sql önce float dönüştürmek veya 1.00 ile çarpın. Hangi çıktı bir float numarası olacaktır. İşte ben 2 ondalık basamak düşünün. İhtiyacınız olanı seçebilirsiniz.


2

Buraya (benim gibi) tamsayı değeri için çözüm bulmak için geldiyseniz , işte cevap:

CAST(9/2 AS UNSIGNED)

5 döndürür

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.