ผมขอรัฐกำปั้นชัดเจน: ฉันสมบูรณ์เข้าใจว่าลอยชนิดจุดไม่ถูกต้องแทนค่าทศนิยม นี่ไม่เกี่ยวกับเรื่องนั้น! อย่างไรก็ตามการคำนวณจุดลอยตัวควรจะถูกกำหนดไว้ล่วงหน้า
ตอนนี้มันออกไปให้ฉันแสดงให้คุณเห็นกรณีแปลก ๆ ที่ฉันสังเกตเห็นในวันนี้ ฉันมีรายการค่าจุดลอยตัวและฉันต้องการรวมค่าเหล่านี้:
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
( ซอซอฟท์แว sqlคุณยังสามารถดูแผนการดำเนินการที่นั่น)
ฉันมีผลรวมเท่ากันมากกว่าค่าเดียวกันแต่ข้อผิดพลาดจุดลอยตัวที่แตกต่างกัน ถ้าฉันเพิ่มแถวลงในตาราง#A
เราจะเห็นว่าค่าสลับกันระหว่างค่าทั้งสอง ฉันสามารถทำซ้ำปัญหานี้ด้วยLEFT JOIN
; INNER JOIN
ทำงานได้ตามที่คาดไว้ที่นี่
นี้จะไม่สะดวกเพราะมันหมายความว่าDISTINCT
, GROUP BY
หรือPIVOT
เห็นพวกเขาเป็นค่าที่แตกต่างกัน (ซึ่งจริง ๆ แล้ววิธีการที่เราค้นพบปัญหานี้)
ทางออกที่ชัดเจนคือการปัดเศษคุณค่า แต่ฉันอยากรู้: มีคำอธิบายเชิงตรรกะสำหรับพฤติกรรมนี้หรือไม่?