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?

Jawaban:


188
select round(123.456, 2, 1)

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.

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))

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


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))

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

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)

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

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)

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)


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.


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?


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


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)

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)

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.


-3

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


-5
select convert(int,@value)

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.