سؤال

لا أحد يعرف لماذا، باستخدام SQLServer 2005

SELECT CONVERT(DECIMAL(30,15),146804871.212533)/CONVERT(DECIMAL (38,9),12499999.9999)

يعطيني 11.74438969709659،

ولكن عندما أقوم بزيادة المنازل العشرية في المقام إلى 15، أحصل على إجابة أقل دقة:

SELECT CONVERT(DECIMAL(30,15),146804871.212533)/CONVERT(DECIMAL (38,15),12499999.9999)

أعطني 11.74438969

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

المحلول

بالنسبة للضرب، نقوم ببساطة بإضافة عدد المنازل العشرية في كل وسيطة معًا (باستخدام القلم والورقة) لحساب أرقام الناتج.

لكن الانقسام يفجر رأسك.أنا خارج للاستلقاء الآن.

من حيث SQL بالرغم من ذلك، فهو كذلك تماما كما هو متوقع.

--Precision = p1 - s1 + s2 + max(6, s1 + p2 + 1)
--Scale = max(6, s1 + p2 + 1)

--Scale = 15 + 38 + 1 = 54
--Precision = 30 - 15 + 9 + 54 = 72
--Max P = 38, P & S are linked, so (72,54) -> (38,20)
--So, we have 38,20 output (but we don use 20 d.p. for this sum) = 11.74438969709659
SELECT CONVERT(DECIMAL(30,15),146804871.212533)/CONVERT(DECIMAL (38,9),12499999.9999)


--Scale = 15 + 38 + 1 = 54
--Precision = 30 - 15 + 15 + 54 = 84
--Max P = 38, P & S are linked, so (84,54) -> (38,8)
--So, we have 38,8 output = 11.74438969
SELECT CONVERT(DECIMAL(30,15),146804871.212533)/CONVERT(DECIMAL (38,15),12499999.9999)

يمكنك أن تفعل نفس الرياضيات إذا اتبعت هذه القاعدة أيضًا، إذا تعاملت مع كل زوج من الأرقام على أنه

  • 146804871.212533000000000 و 12499999.999900000
  • 146804871.212533000000000 و 12499999.999900000000000

نصائح أخرى

لوضعها قريبا، استخدم العشرى (25،13) وسوف يكون على ما يرام مع جميع الحسابات - ستحصل الدقة الحق كما أعلن: 12 رقما قبل نقطة العشرية، و 13 أرقام عشرية بعد. القاعدة هي: ص + الصورة يجب أن يساوي 38، وسوف تكون على الجانب الآمن! لماذا هذا؟ بسبب تنفيذ سيء للغاية من الحساب في SQL Server! حتى إصلاحه، اتبع هذه القاعدة.

ولقد لاحظت أنه إذا كنت تحويل قيمة الفاصل لتعويم، فهو يوفر لك الإجابة الصحيحة، أي بمعنى:.

select 49/30                   (result = 1)

وسوف تصبح:

select 49/cast(30 as float)    (result = 1.63333333333333)

كنا في حيرة بشأن التحول السحري،

ترتبط P & S، لذلك:

  1. (72,54) -> (38,29)

  2. (84,54) -> (38,8)

على افتراض (38,29) هو خطأ مطبعي، وينبغي أن يكون (38,20), ، وفيما يلي الرياضيات:

  1. أنا.72 - 38 = 34 ، الثاني.54 - 34 = 20

  2. أنا.84 - 58 = 46 ، الثاني.54 - 46 = 8

و هذا هو المنطق:

أنا.دقة الإخراج أقل دقة قصوى هي الأرقام التي سنتخلص منها.

ثانيا.ثم يعطينا حجم الإنتاج الأقل مما سنتخلص منه ...الأرقام المتبقية في مقياس الإخراج.

آمل أن يساعد هذا أي شخص آخر يحاول فهم هذا.

وتحويل التعبير لا الحجج.

select  CONVERT(DECIMAL(38,36),146804871.212533 / 12499999.9999)

وعن طريق ما يلي قد تساعد على:

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