اقتطاع المنازل العشرية (غير الدائرية) في SQL Server

StackOverflow https://stackoverflow.com/questions/44046

  •  09-06-2019
  •  | 
  •  

سؤال

أحاول تحديد أفضل طريقة لاقتطاع أو إسقاط المنازل العشرية الإضافية في SQL دون التقريب.على سبيل المثال:

declare @value decimal(18,2)

set @value = 123.456

سيتم تقريب هذا تلقائيًا @value يكون 123.46, ، وهو أمر جيد في معظم الحالات.ومع ذلك، بالنسبة لهذا المشروع، لا أحتاج إلى ذلك.هل هناك طريقة بسيطة لاقتطاع الكسور العشرية التي لا أحتاج إليها؟أعلم أنه يمكنني استخدام left() الدالة وتحويلها مرة أخرى إلى رقم عشري.هل هناك اي طرق اخرى؟

هل كانت مفيدة؟

المحلول

select round(123.456, 2, 1)

نصائح أخرى

ROUND ( 123.456 , 2 , 1 )

عندما المعلمة الثالثة != 0 فهو يقتطع بدلاً من الجولات

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

بناء الجملة

ROUND (تعبير_رقمي، الطول [، الوظيفة])

الحجج

  • numeric_expressionهو تعبير عن فئة نوع البيانات الرقمية أو التقريبية الدقيقة ، باستثناء نوع بيانات بت.

  • طولهي الدقة التي سيتم تقريب التعبير الرقمي إليها.يجب أن يكون الطول تعبيرًا من النوع tinyint أو Smallint أو int.عندما يكون length رقمًا موجبًا، يتم تقريب numeric_expression إلى عدد المواضع العشرية المحددة حسب الطول.عندما يكون الطول رقمًا سالبًا، يتم تقريب التعبير الرقمي على الجانب الأيسر من العلامة العشرية، كما هو محدد حسب الطول.

  • وظيفةهو نوع العملية المراد تنفيذها.يجب أن تكون الدالة tinyint أو Smallint أو int.عندما يتم حذف الدالة أو تكون قيمتها 0 (افتراضي)، يتم تقريب التعبير الرقمي.عند تحديد قيمة غير 0، يتم اقتطاع التعبير الرقمي.
SELECT Cast(Round(123.456,2,1) as decimal(18,2))

هذه هي الطريقة التي تمكنت من الاقتطاع وليس التقريب:

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

في الواقع، مهما كانت المعلمة الثالثة، 0 أو 1 أو 2، فلن تقوم بتقريب القيمة الخاصة بك.

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

تحتوي الجولة على معلمة اختيارية

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

اقتطاع آخر بدون حل تقريب ومثال.

    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

هل تريد العلامة العشرية أم لا؟

إذا لم يكن الأمر كذلك، استخدم

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

إذا قمت بذلك باستخدام 0، فقم بإجراء جولة:

select round(@value,2)

سيؤدي هذا إلى إزالة الجزء العشري من أي رقم

SELECT ROUND(@val,0,1)

أعلم أن هذا متأخر جدًا ولكني لا أراها كإجابة وأستخدم هذه الخدعة منذ سنوات.

ما عليك سوى طرح .005 من القيمة الخاصة بك واستخدام Round(@num,2).

مثالك:

declare @num decimal(9,5) = 123.456

select round(@num-.005,2)

يعود 123.45

سيقوم تلقائيًا بضبط التقريب إلى القيمة الصحيحة التي تبحث عنها.

بالمناسبة، هل تقوم بإعادة إنشاء البرنامج من فيلم Office Space؟

يرجى محاولة استخدام هذا الرمز لتحويل 3 قيم عشرية بعد النقطة إلى منزلتين عشريتين:

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

select @val

الناتج هو 123.46

أعتقد أنك تريد فقط القيمة العشرية ، في هذه الحالة يمكنك استخدام ما يلي:

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

SELECT @val - ROUND(@val,0,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 الدالة مع تعيين المعلمة الثالثة على 1.

أعلم أن هذا السؤال قديم حقًا ولكن لم يستخدم أحد سلاسل فرعية للتقريب.وهذا يمثل ميزة القدرة على تقريب الأرقام الطويلة حقًا (الحد الأقصى لسلسلتك في خادم SQL والذي عادةً ما يكون 8000 حرف):

SUBSTRING('123.456', 1, CHARINDEX('.', '123.456') + 2)
select convert(int,@value)

Mod(x,1) هي أسهل طريقة على ما أعتقد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top