Jak uzyskać wynik zmiennoprzecinkowy, dzieląc dwie wartości całkowite za pomocą T-SQL?


173

Używając T-SQL i Microsoft SQL Server, chciałbym określić liczbę cyfr dziesiętnych, gdy wykonuję podział między 2 liczbami całkowitymi, takimi jak:

select 1/3

To obecnie powraca 0. Chciałbym, żeby wrócił 0,33.

Coś jak:

select round(1/3, -2)

Ale to nie działa. Jak mogę osiągnąć pożądany efekt?


3
Czy próbowałeś 1.0 / 3?
Thilo

Odpowiedzi, które otrzymałem, są więcej niż wystarczające
LaBracca

Odpowiedzi:


277

Sugestie od stb i xiowl są w porządku, jeśli szukasz stałej. Jeśli chcesz użyć istniejących pól lub parametrów, które są liczbami całkowitymi, możesz najpierw rzutować je na liczby zmiennoprzecinkowe:

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

lub

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

Możesz też rzucić je jako ułamki dziesiętne, jeśli chcesz uzyskać wynik dziesiętny.
Tim

30
SELECT 1.0 * MyInt1 / MyInt2
Troglo

@TroubleZero do użytku z MySQLdecimal
itsazzad

wielkie dzięki, uratowałeś mi dzień. Próbowałem CAST (7/3 AS float), ale ponownie zwróciłem 2. Więc rzucanie liczb rozwiązało mój problem.
Yasin Yörük

3
nie ma potrzeby rzutowania zarówno dywidendy, jak i dzielnika, zobacz odpowiedź stackoverflow.com/a/30639343/2866644
@MS

70

Ponieważ SQL Server wykonuje dzielenie liczb całkowitych. Spróbuj tego:

select 1 * 1.0 / 3

Jest to przydatne, gdy przekazujesz liczby całkowite jako parametry.

select x * 1.0 / y

1
Możesz nawet pominąć zera.
John

43

Nie trzeba rzucać ich obu. Typ danych wyniku dla podziału jest zawsze taki, który ma wyższy priorytet typu danych . Zatem rozwiązanie musi być:

SELECT CAST(1 AS float) / 3

lub

SELECT 1 / CAST(3 AS float)


13

Rozumiem, że CASTprzejście do FLOATnie jest dozwolone w MySQL i spowoduje wyświetlenie błędu, gdy spróbujesz, CAST(1 AS float)jak podano w MySQL dev .

Obejście tego problemu jest proste. Po prostu zrób

(1 + 0.0)

Następnie użyj, ROUNDaby uzyskać określoną liczbę miejsc dziesiętnych, takich jak

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

Powyższy kod SQL dzieli 1 na 2 i zwraca liczbę zmiennoprzecinkową do 3 miejsc po przecinku, tak jak by to było 0.500.

Można CASTdo następujących typów: binary, char, date, datetime, decimal, json, nchar, signed, time i unsigned .


3
MySQL pozwala CAST, po prostu nie pozwala na przesyłanie FLOAT. DECIMALZamiast tego przesyłaj do . Zobacz np . Stackoverflow.com/questions/7368163/… .
markusk

7

Wygląda na to, że ta sztuczka działa w SQL Server i jest krótsza (na podstawie poprzednich odpowiedzi)

SELECT 1.0*MyInt1/MyInt2

Lub:

SELECT (1.0*MyInt1)/MyInt2

2
Najbardziej podobało mi się to, nawet ładnie wygląda do obliczeń procentowych:SELECT 100.0 * @Elapsed / @Total
EliSherer

3

Użyj tego

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

Tutaj w tym sql najpierw przekonwertuj na liczbę zmiennoprzecinkową lub pomnóż przez 1,00. Który wynik będzie liczbą zmiennoprzecinkową. Tutaj rozważam 2 miejsca dziesiętne. Możesz wybrać to, czego potrzebujesz.


2

Jeśli przyszedłeś tutaj (tak jak ja), aby znaleźć rozwiązanie dla wartości całkowitej , oto odpowiedź:

CAST(9/2 AS UNSIGNED)

zwraca 5

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.