SQL सर्वर में Truncate (गोल नहीं) दशमलव स्थान


194

मैं एसक्यूएल में अतिरिक्त दशमलव स्थानों को राउंडिंग के बिना अलग करने या छोड़ने का सबसे अच्छा तरीका निर्धारित करने की कोशिश कर रहा हूं। उदाहरण के लिए:

declare @value decimal(18,2)

set @value = 123.456

यह स्वचालित रूप से गोल @valueहोगा 123.46, जो कि ज्यादातर मामलों में अच्छा है। हालाँकि, इस परियोजना के लिए, मुझे इसकी आवश्यकता नहीं है। वहाँ एक आसान तरीका है कि मैं क्या ज़रूरत नहीं है दशमलव छोटा करना है? मुझे पता है कि मैं left()फ़ंक्शन का उपयोग कर सकता हूं और वापस दशमलव में परिवर्तित कर सकता हूं । क्या कोई अन्य तरीके हैं?

जवाबों:


188
select round(123.456, 2, 1)

28
उत्तर को यह स्पष्ट करना चाहिए कि फ़ंक्शन के पैरामीटर क्या हैं
टायलर

9
SQL ROUND (संख्या, दशमलव, ऑपरेशन): ऑपरेशन -> यदि 0, तो यह परिणाम को दशमलव की संख्या तक ले जाता है। यदि कोई मान 0 से अधिक है, तो यह परिणाम को दशमलव की संख्या से कम कर देता है। डिफ़ॉल्ट 0 है
मिधुन डार्विन

आप एक जीवन रक्षक हैं, मेरे पास पिछले दो अंकों को केवल "1.9991666" दिखाने के लिए राशि थी, हालाँकि यह हमेशा 2 तक ही सीमित रहती थी, चाहे मैं कुछ भी उपयोग करूं, इसके साथ ही मैं इस तरह से कुछ हासिल करने में सक्षम हूं - FORMAT का चयन करें (राउंड (1.9991666) , 2, 1), 'एन 2') के रूप में 'दर', धन्यवाद दोस्त
स्पाइडर

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 वह सटीक है, जिसके लिए संख्यात्मक_प्रक्रम को गोल किया जाना है। लंबाई टाइपिस्ट, स्मॉलिंट, या इंट की अभिव्यक्ति होनी चाहिए। जब लंबाई एक धनात्मक संख्या होती है, तो संख्यात्मक_प्रगति लंबाई द्वारा निर्दिष्ट दशमलव पदों की संख्या तक होती है। जब लंबाई एक ऋणात्मक संख्या होती है, तो संख्यात्मक बिंदु के रूप में लंबाई के अनुसार, दशमलव बिंदु के बाईं ओर सांख्यिक_उपकरण को गोल किया जाता है।

  • function प्रदर्शन करने के लिए ऑपरेशन का प्रकार है। फ़ंक्शन छोटा, छोटा, या इंट होना चाहिए। जब फ़ंक्शन को छोड़ दिया जाता है या 0 (डिफ़ॉल्ट) का मान होता है, तो num_expression राउंड किया जाता है। जब 0 के अलावा कोई मान निर्दिष्ट किया जाता है, तो num_expression कम हो जाता है।

किसी को पता है कि फ़ंक्शन तर्क के लिए कौन से मूल्य स्मालिंट, स्मॉलिंट और इंट के अनुरूप हैं? Microsoft ने अपने दस्तावेज़ से उस हिस्से को छोड़ दिया और कहीं भी उत्तर नहीं मिला। msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx
डेव

MS SQL SERVER राउंड नंबर IQ से थोड़ा अलग है। इस दौर की तरह राउंड (x, y, z) फंक्शन का उपयोग करने के लिए (val1 / val2,4,1)
वॉरेन लाफ्रेंस


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

मुझे यह उत्तर समझ में नहीं आता। दिए गए एसक्यूएल का परिणाम 10.01 है, जो कि दो दशमलव स्थानों पर 10.0055 का सही राउंडिंग है। यदि अंतिम पैरामीटर 0 नहीं है, तो मान को घटाकर (2 दशमलव स्थानों पर) 10.00 कर दिया जाता है।
8128

7

राउंड में एक वैकल्पिक पैरामीटर है

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
बिक्रम

4
मैं नहीं देखता कि यह क्यों बढ़ जाता है। उपरोक्त आपको क्रमशः 123.450 और 123.460 देगा।
रेमीकेरेम

7

आप दशमलव चाहते हैं या नहीं?

यदि नहीं, तो उपयोग करें

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

यदि आप इसे 0 से करते हैं तो एक राउंड करें:

select round(@value,2)

1
क्षमा करें, अगर मैं स्पष्ट नहीं था, तो मुझे दशमलव स्थानों को रखने की आवश्यकता है, बस उन लोगों को छोड़ दें जो मुझे नहीं चाहिए। उदाहरण के लिए, 123.456 के बजाय मेरे उदाहरण में ऊपर 123.46 में परिवर्तित किया जा रहा है ... मैं तीसरे दशमलव को छोड़ना चाहता हूं और इसे 123.45 करना चाहता हूं।
बजे रयान ईस्टाब्रुक

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 वास्तव में काफी अच्छी तरह से काम करता है।
डेराबस्सी

4

यह किसी भी संख्या के दशमलव भाग को हटा देगा

SELECT ROUND(@val,0,1)

2
ऐसा नहीं होता। Select ROUND (123.4560,0,1) आपको इसके बदले 123.0000 देता है।
रेमीकेरेम

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

दशमलव बिंदु के बाद आपको 2 मान देगा। (एमएस एसक्यूएल सर्वर)


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 
╚═════════╩═════════╝

टिप्पणी:

मैं ROUND1 से सेट 3 पैरामीटर के साथ अंतर्निहित फ़ंक्शन का उपयोग करने की सलाह देता हूं ।


1
ODBC स्केलर फ़ंक्शन - विभिन्न वैकल्पिक!
अरुलमूझी

1

मुझे पता है कि यह बहुत देर हो चुकी है, लेकिन मैं इसे एक जवाब के रूप में नहीं देखता हूं और वर्षों से इस चाल का उपयोग कर रहा हूं।

बस अपने मूल्य से .5 को घटाएं और गोल (@ संख्या, 2) का उपयोग करें।

आपका उदाहरण:

declare @num decimal(9,5) = 123.456

select round(@num-.005,2)

123.45 देता है

यह स्वचालित रूप से उस सही मान को समायोजित कर देगा जिसकी आप तलाश कर रहे हैं।

वैसे, क्या आप फिल्म ऑफिस स्पेस से कार्यक्रम को फिर से बना रहे हैं?


0

2 दशमलव स्थानों में 3 दशमलव मानों को परिवर्तित करने के लिए कृपया इस कोड का उपयोग करने का प्रयास करें:

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

select @val

आउटपुट 123.46 है


1) तीसरी पंक्ति पूरी तरह से अनावश्यक 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 में पाए जाने वाले सरल उदाहरण समाधान के साथ बहुत आसान हो सकते हैं:

समस्या कथन: STATATION के उत्तरी अक्षांश (LAT_N) का सबसे बड़ा मान 137.2345 से कम है। 4 दशमलव स्थानों पर अपने उत्तर को काटें।

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

ऊपर दिए गए समाधान से आपको यह पता चलता है कि केवल 4 दशमलव बिंदुओं तक सीमित मूल्य कैसे बनाया जाए। यदि आप दशमलव के बाद की संख्याओं को कम या अधिक करना चाहते हैं, तो बस 4 को जो आप चाहते हैं, बदल दें।


-3

Mod(x,1) सबसे आसान तरीका मुझे लगता है।


-5
select convert(int,@value)

1
यह वही नहीं है जो ओपी चाहता था। वह अभी भी दशमलव स्थानों को चाहता है, लेकिन वह उन्हें गोल करने के बजाय उन्हें (ट्रिंकेट) निकालना चाहता है। IE 123.456 -> 123.45 नहीं 123.456 -> 12.46 और नहीं 123.456 -> 123
जॉन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.