আমাকে সুস্পষ্ট মুষ্টিটি বর্ণনা করতে দাও: আমি সম্পূর্ণরূপে বুঝতে পারি যে ভাসমান পয়েন্টের ধরণগুলি দশমিক মানগুলি সঠিকভাবে উপস্থাপন করতে পারে না । এটি যে সম্পর্কে না! তবুও, ভাসমান পয়েন্ট গণনাগুলি হ্রাসকারী বলে মনে করা হচ্ছে ।
এখন যেহেতু এটি অতিক্রম হয়েছে, আমি আপনাকে আজ উত্সাহিত কৌতূহলী কেসটি দেখাব। আমার কাছে ভাসমান-পয়েন্টের মানগুলির একটি তালিকা রয়েছে এবং আমি সেগুলি যোগ করতে চাই:
CREATE TABLE #someFloats (val float);
INSERT INTO #someFloats (val) VALUES (1), (1), (1.2), (1.2), (1.2), (3), (5);
SELECT STR(SUM(#someFloats.val), 30, 15) FROM #someFloats;
DROP TABLE #someFloats;
-- yields:
-- 13.600000000000001
এতক্ষণ, এত ভাল - এখানে কোনও আশ্চর্যের কিছু নেই। আমরা সকলেই জানি যে 1.2
বাইনারি উপস্থাপনে হুবহু উপস্থাপন করা যায় না, সুতরাং "অসম্পূর্ণ" ফলাফলটি প্রত্যাশিত।
আমি যখন অন্য টেবিলে বাম-যোগদান করি তখন নিম্নলিখিত অদ্ভুত জিনিসটি ঘটে:
CREATE TABLE #A (a int);
INSERT INTO #A (a) VALUES (1), (2);
CREATE TABLE #someFloats (val float);
INSERT INTO #someFloats (val) VALUES (1), (1), (1.2), (1.2), (1.2), (3), (5);
SELECT #A.a, STR(SUM(#someFloats.val), 30, 15)
FROM #someFloats LEFT JOIN #A ON 1 = 1
GROUP BY #A.a;
DROP TABLE #someFloats;
DROP TABLE #A;
-- yields
-- 1 13.600000000000001
-- 2 13.599999999999998
( বর্গফুট স্কিডল , আপনি সেখানে কার্যকর করার পরিকল্পনা দেখতেও পারেন)
আমি একই ওভার সমষ্টি একই মান, কিন্তু একটি ভিন্ন ফ্লোটিং পয়েন্ট ত্রুটি। আমি যদি টেবিলটিতে আরও সারি যুক্ত করি তবে #A
আমরা দেখতে পাব যে মানটি দুটি মানের মধ্যে বিকল্প হয়। আমি কেবল এই সমস্যাটি একটি দিয়ে পুনরায় উত্পাদন করতে সক্ষম হয়েছি LEFT JOIN
; INNER JOIN
এখানে প্রত্যাশা মত কাজ করে।
এটি অসুবিধাগুলি, কারণ এর অর্থ হ'ল ক DISTINCT
, GROUP BY
বা PIVOT
তাদের বিভিন্ন মান হিসাবে দেখায় (যা আসলে আমরা এই সমস্যাটি কীভাবে আবিষ্কার করেছি)।
সুস্পষ্ট সমাধান হ'ল মানটি গোল করা, কিন্তু আমি কৌতূহল: এই আচরণের জন্য কি কোনও যৌক্তিক ব্যাখ্যা আছে?