স্বয়ংক্রিয় দশমিক রাউন্ডিং সমস্যা


11

প্রশ্ন তুলনামূলক সহজ। আমাকে 3 টি কলাম গণনা করতে হবে যেখানে মাঝের ফলাফলগুলি বিশাল দশমিক are এবং আমি এসকিউএল সার্ভারের সাথে প্রাথমিকভাবে কোনও কাস্ট / রূপান্তর নির্বিশেষে দশমিকের বৃত্তাকারে একটি সমস্যায় পড়ছি।

উদাহরণস্বরূপ, আসুন 1234/1233 হিসাবে একটি সাধারণ বিভাগ করি। একটি ক্যালকুলেটর 1,00081103000811 উত্পাদন করবে। আমি যখন এসকিউএল সার্ভারে এটি করি তখন আমরা নিম্নলিখিতগুলি পাই:

-- Result: rounded at 1.000811000... with trailing zeroes up until the 37 precision
SELECT CAST(CAST(1234 AS DEC(38,34))/CAST(1233 AS DEC(38,34)) AS DEC(38,37))

-- Result: rounded at 1.000811
SELECT CONVERT(DECIMAL(38,32), 1234)/CONVERT(DECIMAL(38,32),1233)

-- Correct result at 1,00081103000811
-- But this requires the zeroes to be put in manually when you don't
-- even know the precision of the end result
SELECT 1234.0/1233.00000000000000

কেন এই স্বয়ংক্রিয় রাউন্ডিং ঘটে? এবং দীর্ঘতম দশমিক মানগুলি গণনা করার সর্বোত্তম উপায় কী যখন আপনি নিশ্চিত হতে পারবেন না যে কোনও সংখ্যা (ইন্ট বা ডেস অংশ) কত বড় হবে, যেহেতু সারণীতে বিভিন্ন ভিন্ন মান থাকতে পারে?

ধন্যবাদ!

উত্তর:


17

TL; ড

এসকিউএল ভাষায় গণনা করবেন না

দীর্ঘ্য

ফলাফল স্কেল এবং নির্ভুলতা এখানে এমএসডিএন-তে ভালভাবে সংজ্ঞায়িত করা হয়েছে । এটি স্বজ্ঞাত নয়, সত্যই। তবে, সহজ ভাষায়, ইনপুট স্কেলগুলি বেশি হলে নির্ভুলতা হারিয়ে যায় কারণ ফলাফলের স্কেলগুলি মিলে যাওয়া নির্ভুলতা ড্রপের সাথে 38 এ নামানো দরকার।

জিনিস নিশ্চিত করতে

  • প্রথম উদাহরণে আপনার অতিরিক্ত CAST কেবল জিরো যুক্ত করুন
  • আমার এমএসডিএন লিঙ্ক অনুযায়ী কাটাটি ঘটে (দ্বিতীয় উদাহরণ)
  • ধ্রুবকগুলির সাথে তৃতীয় উদাহরণ দশমিক মানগুলিকে বোঝায় যা কেবলমাত্র যথেষ্ট (5,1) এবং 18,14)।
    এর অর্থ ফলাফলের স্কেল এবং নির্ভুলতার কোনও কাটা কাটা নেই (ঘা দেখুন)

প্রথম এবং তৃতীয় মামলায় আরও ..

বিভাগের জন্য ফলাফল স্কেল max(6, s1 + p2 + 1):

  • প্রথম উদাহরণ, এই 77 যা 38 যথার্থ করার অবনমিত হয়েছে নিচে (দেখুন 6 কমপক্ষে সাপেক্ষে একভাবে বাধ্য হয়, হয় এই )
  • তৃতীয় উদাহরণ, এটি 24 তাই নির্ভুলতার সামঞ্জস্য করার প্রয়োজন হয় না

আপনার কাছে কিছু বিকল্প আছে

  • ক্লায়েন্ট কোড যেমন গণনা। নেট
  • নেট গণনা করতে সিএলআর ফাংশন ব্যবহার করুন
  • নির্ভুলতার ক্ষতি নিয়ে বেঁচে থাকুন
  • সেরা হিসাবে উল্লেখযোগ্য 15 টি চিত্র সহ ভাসা এবং লাইভ ব্যবহার করুন

স্বতঃস্ফূর্তভাবে, এটি এসও /programming/423925/t-sql-decimal-division-accuracy/424052#424052 এ দেখুন


1

নিশ্চিত না যে এটি সাহায্য করে তবে আমার জন্য আমার টেম্প টেবিল কলামটি দশমিক হিসাবে সেট করা হয়েছিল, আমি _োকানো থেকে টেম্প _ টেবিলটিতে রূপান্তর (দশমিক (15,2), 0.65) দিয়ে যাচ্ছিলাম। এটি অটো রাউন্ডিং ছিল, যা পেরিয়ে যাচ্ছিল তা মেলানোর জন্য আমি কলামের ধরণকে দশমিক (16,2) এ পরিবর্তন করেছি। সারণী এখন 0.65 সংরক্ষণ করছে।


1

আমাকে চারপাশে একটা কাজ করতে হয়েছিল। আমি যা করেছি তা এখানে:

-----------------------------------
DECLARE @DENIED INT  = 33443
DECLARE @PAID INT = 148353
DECLARE @PCT Decimal (6,2)

SET @PCT = (@DENIED * 100.00 / @PAID)  -- Instead of dividing by 100, I included decimals

SELECT
@DENIED AS DEN
,@PAID AS PAID
,@PCT AS PCT

ফলাফল:

DEN PAID    PCT
-----   ----    -----
33443   148353  22.54   -- Instead of 22.00

আশাকরি এটা সাহায্য করবে.

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.