ตัดทอน (ไม่ใช่รอบ) ทศนิยมใน SQL Server


194

ฉันกำลังพยายามหาวิธีที่ดีที่สุดในการตัดหรือวางทศนิยมพิเศษใน SQL โดยไม่ต้องปัดเศษ ตัวอย่างเช่น:

declare @value decimal(18,2)

set @value = 123.456

รอบนี้จะโดยอัตโนมัติ@valueจะเป็น123.46ซึ่งเป็นสิ่งที่ดีในกรณีส่วนใหญ่ อย่างไรก็ตามสำหรับโครงการนี้ฉันไม่ต้องการสิ่งนั้น มีวิธีง่ายๆในการตัดส่วนทศนิยมที่ไม่ต้องการหรือไม่? ฉันรู้ว่าฉันสามารถใช้left()ฟังก์ชันและแปลงกลับเป็นทศนิยม มีวิธีอื่นอีกไหม?

คำตอบ:


188
select round(123.456, 2, 1)

28
คำตอบควรอธิบายว่าพารามิเตอร์ของฟังก์ชันคืออะไร
Tyler

9
SQL ROUND (ตัวเลข, ทศนิยม, การทำงาน): Operation -> ถ้าเป็น 0 มันจะปัดผลลัพธ์เป็นจำนวนทศนิยม หากค่าอื่นมากกว่า 0 จะตัดทอนผลลัพธ์เป็นจำนวนทศนิยม ค่าเริ่มต้นคือ 0
Midhun Darvin

คุณเป็นผู้ช่วยชีวิตฉันมีจำนวนที่จะแสดงตัวเลขสองหลักสุดท้ายเท่านั้น "1.9991666" แต่มันจะปัดขึ้นเป็น 2 เสมอไม่ว่าฉันจะใช้อะไรด้วยวิธีนี้ฉันสามารถบรรลุสิ่งนี้ - เลือกรูปแบบ (รอบ (1.9991666 , 2, 1), 'N2') ตาม 'อัตรา' ขอบคุณเพื่อน
Spider

269
ROUND ( 123.456 , 2 , 1 )

เมื่อพารามิเตอร์ที่สาม! = 0มันตัดทอนมากกว่ารอบ

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

วากยสัมพันธ์

ROUND ( numeric_expression , length [ ,function ] )

ข้อโต้แย้ง

  • numeric_expression เป็นการแสดงออกของประเภทข้อมูลตัวเลขหรือตัวเลขที่แน่นอนโดยประมาณยกเว้นชนิดข้อมูลบิต

  • length คือความแม่นยำที่จะปัดเศษ numeric_expression ความยาวจะต้องเป็นประเภทนิพจน์จิ๋วจิ๋วจิ้นท์หรือ int เมื่อ length เป็นจำนวนบวก numeric_expression จะถูกปัดเศษเป็นจำนวนตำแหน่งทศนิยมที่ระบุโดยความยาว เมื่อความยาวเป็นจำนวนลบ numeric_expression จะถูกปัดเศษทางด้านซ้ายของจุดทศนิยมตามที่ระบุด้วยความยาว

  • function เป็นประเภทของการดำเนินการที่จะดำเนินการ ฟังก์ชั่นจะต้องเป็น smallint, smallint หรือ int เมื่อละเว้นฟังก์ชันหรือมีค่า 0 (ค่าเริ่มต้น) numeric_expression จะถูกปัดเศษ เมื่อระบุค่าอื่นที่ไม่ใช่ 0 numeric_expression จะถูกปัดเศษ

ใครรู้ว่าค่าสำหรับการโต้แย้งฟังก์ชั่นที่สอดคล้องกับจิ๋วสีจิ๋วและ int? Microsoft ได้ละทิ้งส่วนดังกล่าวจากเอกสารของพวกเขาและไม่สามารถหาคำตอบได้ทุกที่ msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx
เดฟ

MS SQL SERVER ปัดเศษตัวเลขต่างจาก IQ เล็กน้อย ในการแก้ไขให้ใช้ฟังก์ชัน round (x, y, z) เช่น round นี้ (val1 / val2,4,1)
Warren LaFrance


13

นี่คือวิธีที่ฉันสามารถตัดทอนและไม่ปัดเศษ:

select 100.0019-(100.0019%.001)

ผลตอบแทน 100.0010

และตัวอย่างของคุณ:

select 123.456-(123.456%.001)

ส่งคืน 123.450

ตอนนี้ถ้าคุณต้องการกำจัดจุดสิ้นสุดให้ทิ้งมันลงไป:

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

ส่งคืน 123.45


10

จริงๆแล้วพารามิเตอร์ตัวที่สามคือ 0 หรือ 1 หรือ 2 มันจะไม่ปัดเศษค่าของคุณ

CAST(ROUND(10.0055,2,0) AS NUMERIC(10,2))

ฉันไม่เข้าใจคำตอบนี้ ผลลัพธ์ SQL ที่กำหนดใน 10.01 ซึ่งเป็นการปัดเศษที่ถูกต้องคือ 10.0055 ถึงทศนิยมสองตำแหน่ง หากพารามิเตอร์สุดท้ายไม่ใช่ 0 ค่าจะถูกปัดเศษ (เป็นทศนิยม 2 ตำแหน่ง) ถึง 10.00
8128

7

Round มีพารามิเตอร์ที่เป็นทางเลือก

Select round(123.456, 2, 1)  will = 123.45
Select round(123.456, 2, 0)  will = 123.46

3
เลือกรอบ (123.456, 2, 1) จะ = 123.450
Bikram

4
ฉันไม่เห็นสาเหตุที่ทำให้ upvotes นี้ ด้านบนจะให้ 123.450 และ 123.460 ตามลำดับ
remykarem

7

คุณต้องการทศนิยมหรือไม่?

ถ้าไม่ใช้ให้ใช้

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

ถ้าคุณทำด้วย 0 ให้ทำรอบ:

select round(@value,2)

1
ขออภัยถ้าฉันยังไม่ชัดเจนฉันต้องเก็บทศนิยมไว้แค่หยดที่ฉันไม่ต้องการ ตัวอย่างเช่นแทนที่จะเป็น 123.456 ในตัวอย่างด้านบนของฉันถูกแปลงเป็น 123.46 ... ฉันต้องการวางทศนิยมที่สามและทำให้เป็น 123.45
Ryan Eastabrook

6

ตัดอีกโดยไม่มีวิธีการปัดเศษและตัวอย่าง

    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()ซึ่งเป็นวิธีการที่จะวางทศนิยมโดยไม่ต้องปัดเศษแน่นอน ชั้นแย่เกินไป () ไม่มีพารามิเตอร์ที่สองเพื่อระบุตำแหน่งที่ แต่ฉันคิดว่า * 10) / 10 ทำงานได้ดีทีเดียว
deroby

4

จะเป็นการลบส่วนทศนิยมของตัวเลขใด ๆ

SELECT ROUND(@val,0,1)

2
มันไม่ใช่. เลือกรอบ (123.4560,0,1) ให้ 123.0000 คุณแทน
remykarem

2
SELECT CAST(Value as Decimal(10,2)) FROM TABLE_NAME;

จะให้ 2 ค่าหลังจากจุดทศนิยม (เซิร์ฟเวอร์ MS SQL)


1

อีกวิธีคือODBC TRUNCATEฟังก์ชั่น:

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

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

LiveDemo

เอาท์พุท:

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

สังเกต:

ฉันแนะนำให้ใช้ROUNDฟังก์ชั่นในตัวโดยตั้งค่าพารามิเตอร์ที่ 3 เป็น 1


1
ฟังก์ชั่นเกลา ODBC - ทางเลือกที่แตกต่างกัน!
Arulmouzhi

1

ฉันรู้ว่ามันค่อนข้างช้า แต่ฉันไม่เห็นว่ามันเป็นคำตอบและใช้เคล็ดลับนี้มาหลายปีแล้ว

เพียงลบ .005 จากมูลค่าของคุณและใช้ Round (@ num, 2)

ตัวอย่างของคุณ:

declare @num decimal(9,5) = 123.456

select round(@num-.005,2)

ส่งคืน 123.45

มันจะปรับการปัดเศษเป็นค่าที่คุณต้องการโดยอัตโนมัติ

คุณสร้างโปรแกรมจากภาพยนตร์ Office Space ขึ้นใหม่หรือไม่?


0

โปรดลองใช้รหัสนี้สำหรับการแปลงค่าทศนิยม 3 ตำแหน่งหลังจากจุดเป็นทศนิยม 2 ตำแหน่ง:

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

select @val

ผลลัพธ์คือ 123.46


1) บรรทัดที่ 3 ไม่จำเป็นอย่างสมบูรณ์ 2) เขาบอกอย่างชัดเจนว่าเขาไม่ต้องการปัดเศษตัวเลข แต่ตัดมัน (ผลลัพธ์ควรเป็น 123.45)
Damián Pablo González

0

ฉันคิดว่าคุณต้องการเพียงค่าทศนิยมในกรณีนี้คุณสามารถใช้ต่อไปนี้:

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

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

0

ฉันรู้ว่าคำถามนี้เก่ามาก แต่ไม่มีใครใช้สตริงย่อยเพื่อปัดเศษ นี่เป็นข้อได้เปรียบความสามารถในการปัดเศษตัวเลขที่ยาวมาก ๆ (จำกัด สตริงของคุณในเซิร์ฟเวอร์ SQL ซึ่งโดยปกติจะมีอักขระ 8000 ตัว):

SUBSTRING('123.456', 1, CHARINDEX('.', '123.456') + 2)

0

ฉันคิดว่าเราสามารถไปได้ง่ายขึ้นด้วยโซลูชันตัวอย่างที่ง่ายกว่าที่พบใน Hackerrank:

คำแถลงปัญหา: ค้นหาคุณค่าสูงสุดของละติจูดเหนือ (LAT_N) จากสถานีที่น้อยกว่า 137.2345 ตัดคำตอบของคุณเป็นทศนิยม 4 ตำแหน่ง

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

การแก้ปัญหาด้านบนช่วยให้คุณมีความคิดในการสร้างมูลค่าเพียง 4 จุดทศนิยม ถ้าคุณต้องการลดจำนวนหรือระดับบนหลังจุดทศนิยมให้เปลี่ยน 4 เป็นจำนวนที่คุณต้องการ



-5
select convert(int,@value)

1
นี่ไม่ใช่สิ่งที่ OP ต้องการ เขายังต้องการตำแหน่งทศนิยม แต่เขาต้องการลบ (truncte) แทนที่จะปัดเศษ IE 123.456 -> 123.45 ไม่ใช่ 123.456 -> 12.46 และไม่ใช่ 123.456 -> 123
John
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.