Memotong (tidak bulat) tempat desimal di SQL Server

194

Saya mencoba menentukan cara terbaik untuk memotong atau menjatuhkan tempat desimal ekstra di SQL tanpa pembulatan. Sebagai contoh:

declare @value decimal(18,2)

set @value = 123.456

Ini secara otomatis akan @valuemenjadi 123.46, yang baik dalam banyak kasus. Namun, untuk proyek ini, saya tidak butuh itu. Apakah ada cara sederhana untuk memotong desimal yang tidak saya butuhkan? Saya tahu saya bisa menggunakan left()fungsi dan mengkonversi kembali ke desimal. Apakah ada cara lain?

Ryan Eastabrook
sumber

Jawaban:

188
select round(123.456, 2, 1)
Jimmy
sumber
27
Jawabannya harus menjelaskan apa parameter fungsi
Tyler
9
SQL ROUND (angka, desimal, operasi): operasi -> Jika 0, itu membulatkan hasil ke angka desimal. Jika nilai lain dari 0, itu memotong hasil ke jumlah desimal. Standarnya adalah 0
Midhun Darvin
Anda adalah seorang penyelamat, saya memiliki jumlah untuk menunjukkan dua digit terakhir hanya "1,9991666", namun selalu dibulatkan hingga 2 tidak peduli apa yang saya gunakan, dengan ini saya dapat mencapai sesuatu seperti ini - pilih FORMAT (bulat (1.9991666 , 2, 1), 'N2') SEBAGAI 'Nilai', Terima kasih sobat
Spider
269
ROUND ( 123.456 , 2 , 1 )

Ketika parameter ketiga ! = 0 itu terpotong daripada putaran

http://msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx

Sintaksis

ROUND ( numeric_expression , length [ ,function ] )

Argumen

  • numeric_expression Merupakan ekspresi dari kategori tipe data numerik yang tepat atau perkiraan, kecuali untuk tipe data bit.

  • length Apakah presisi yang numeric_expression harus dibulatkan. panjang harus berupa ekspresi tipe tinyint, smallint, atau int. Ketika panjang adalah angka positif, numeric_expression dibulatkan ke jumlah posisi desimal yang ditentukan oleh panjang. Ketika panjang adalah angka negatif, numeric_expression dibulatkan di sisi kiri titik desimal, seperti yang ditentukan oleh panjang.

  • function Apakah jenis operasi yang harus dilakukan. fungsi harus tinyint, smallint, atau int. Ketika fungsi dihilangkan atau memiliki nilai 0 (default), numeric_expression dibulatkan. Ketika nilai selain 0 ditentukan, numeric_expression terpotong.
Jeff Cuscutis
sumber
Adakah yang tahu nilai apa untuk argumen fungsi yang berhubungan dengan tinyint, smallint dan int? Microsoft meninggalkan bagian itu dari dokumentasi mereka dan tidak dapat menemukan jawabannya di mana pun. msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx
Dave
MS SQL SERVER membulatkan angka sedikit berbeda dari IQ. Untuk memperbaikinya gunakan fungsi ronde (x, y, z) seperti ronde ini (val1 / val2,4,1)
Warren LaFrance
37
SELECT Cast(Round(123.456,2,1) as decimal(18,2))
sth
sumber
13

Inilah cara saya dapat memotong dan tidak membulat:

select 100.0019-(100.0019%.001)

mengembalikan 100.0010

Dan contoh Anda:

select 123.456-(123.456%.001)

mengembalikan 123.450

Sekarang jika Anda ingin menghilangkan nol akhir, cukup masukkan:

select cast((123.456-(123.456%.001)) as decimal (18,2))

mengembalikan 123.45

sth
sumber
10

Sebenarnya apa pun parameter ketiga, 0 atau 1 atau 2, tidak akan membulatkan nilai Anda.

CAST(ROUND(10.0055,2,0) AS NUMERIC(10,2))
Jai
sumber
Saya tidak mengerti jawaban ini. Hasil SQL yang diberikan dalam 10,01, yang merupakan pembulatan yang benar dari 10,0055 ke dua tempat desimal. Jika parameter terakhir bukan 0, nilainya terpotong (ke 2 tempat desimal) menjadi 10,00.
8128
7

Putaran memiliki parameter opsional

Select round(123.456, 2, 1)  will = 123.45
Select round(123.456, 2, 0)  will = 123.46
Quentin
sumber
3
Pilih ronde (123.456, 2, 1) akan = 123.450
Bikram
4
Saya tidak mengerti mengapa hal ini menjadi kacau. Di atas akan memberi Anda masing-masing 123,450 dan 123,460.
remykarem
7

Anda ingin desimal atau tidak?

Jika tidak, gunakan

select ceiling(@value),floor(@value)

Jika Anda melakukannya dengan 0 maka lakukan putaran:

select round(@value,2)
SQLMenace
sumber
1
Maaf jika saya tidak jelas, saya harus menyimpan tempat desimal, cukup taruh yang tidak saya inginkan. Misalnya, alih-alih 123,456 dalam contoh saya di atas dikonversi menjadi 123,46 ... Saya ingin menurunkan desimal ketiga dan menjadikannya 123,45.
Ryan Eastabrook
6

Potong lainnya tanpa solusi pembulatan dan contoh.

    Convert 71.950005666 to a single decimal place number (71.9)
    1) 71.950005666 * 10.0 = 719.50005666
    2) Floor(719.50005666) = 719.0
    3) 719.0 / 10.0 = 71.9

    select Floor(71.950005666 * 10.0) / 10.0
James
sumber
2
+1 Floor()yang merupakan cara untuk menjatuhkan desimal tanpa pembulatan. Lantai terlalu buruk () tidak memiliki parameter kedua untuk menunjukkan di posisi mana. Tapi saya pikir * 10) / 10 bekerja dengan sangat baik.
deroby
4

Ini akan menghapus bagian desimal dari angka apa pun

SELECT ROUND(@val,0,1)
Probal
sumber
2
Itu tidak. SELECT ROUND (123.4560,0,1) memberi Anda 123.0000 sebagai gantinya.
remykarem
2
SELECT CAST(Value as Decimal(10,2)) FROM TABLE_NAME;

Akan memberi Anda 2 nilai setelah titik desimal. (MS SQL SERVER)

Dawood Zaidi
sumber
1

Cara lain adalah ODBC TRUNCATEfungsi:

DECLARE @value DECIMAL(18,3) =123.456;

SELECT @value AS val, {fn TRUNCATE(@value, 2)} AS result

LiveDemo

Keluaran:

╔═════════╦═════════╗
   val    result  
╠═════════╬═════════╣
 123,456  123,450 
╚═════════╩═════════╝

Ucapan:

Saya sarankan menggunakan ROUNDfungsi bawaan dengan parameter ke-3 diatur ke 1.

Lukasz Szozda
sumber
1
Fungsi Skalar ODBC - Alternatif Berbeda!
Arulmouzhi
1

Saya tahu ini agak terlambat tetapi saya tidak melihatnya sebagai jawaban dan telah menggunakan trik ini selama bertahun-tahun.

Cukup kurangi 0,005 dari nilai Anda dan gunakan Round (@ num, 2).

Contoh Anda:

declare @num decimal(9,5) = 123.456

select round(@num-.005,2)

mengembalikan 123.45

Secara otomatis akan menyesuaikan pembulatan ke nilai yang benar yang Anda cari.

Omong-omong, apakah Anda membuat ulang program dari film Office Space?

KeithL
sumber
0

Coba gunakan kode ini untuk mengonversi 3 nilai desimal setelah satu titik menjadi 2 tempat desimal:

declare @val decimal (8, 2)
select @val = 123.456
select @val =  @val

select @val

Outputnya adalah 123,46

sth
sumber
1) Baris ke-3 sama sekali tidak perlu 2) dia secara eksplisit mengatakan dia tidak ingin membulatkan angka, tetapi memotongnya (hasilnya harus 123,45)
Damián Pablo González
0

Saya pikir Anda hanya menginginkan nilai desimal, dalam hal ini Anda dapat menggunakan yang berikut:

declare @val decimal (8, 3)
SET @val = 123.456

SELECT @val - ROUND(@val,0,1)
Mohamed
sumber
0

Saya tahu pertanyaan ini benar-benar tua tetapi tidak ada yang menggunakan sub-string untuk membulatkan. Ini sebagai keuntungan kemampuan untuk membulatkan angka yang sangat panjang (batas string Anda di SQL server yang biasanya 8000 karakter):

SUBSTRING('123.456', 1, CHARINDEX('.', '123.456') + 2)
tukan
sumber
0

Saya pikir kita bisa lebih mudah dengan solusi contoh sederhana yang ditemukan di Hackerrank:

Pernyataan masalah: Permintaan nilai terbesar Lintang Utara (LAT_N) dari STATION yang kurang dari 137,2345. Potong jawaban Anda ke 4 tempat desimal.

SELECT TRUNCATE(MAX(LAT_N),4)
FROM STATION
WHERE LAT_N < 137.23453;

Solusi Di atas memberi Anda ide bagaimana membuat nilai terbatas pada 4 poin desimal. Jika Anda ingin menurunkan atau menambah angka setelah desimal, ubah saja 4 menjadi apa pun yang Anda inginkan.

Ishwor Bhusal
sumber
-3

Mod(x,1) adalah cara termudah yang saya pikirkan.

sth
sumber
-5
select convert(int,@value)
SQLMenace
sumber
1
Ini bukan yang diinginkan OP. Dia masih menginginkan tempat desimal, tetapi dia ingin menghapusnya (memotong) daripada membulatkannya. IE 123.456 -> 123.45 BUKAN 123.456 -> 12.46 dan BUKAN 123.456 -> 123
John