นี่คือรหัสที่ฉันใช้ในตัวอย่าง:
PRINT @set1
PRINT @set2
SET @weight= @set1 / @set2;
PRINT @weight
นี่คือผลลัพธ์:
47
638
0
ฉันอยากรู้ว่าทำไมมันถึงกลับมา0
แทนที่จะเป็น0,073667712
นี่คือรหัสที่ฉันใช้ในตัวอย่าง:
PRINT @set1
PRINT @set2
SET @weight= @set1 / @set2;
PRINT @weight
นี่คือผลลัพธ์:
47
638
0
ฉันอยากรู้ว่าทำไมมันถึงกลับมา0
แทนที่จะเป็น0,073667712
คำตอบ:
ประกาศ set1 และ set2 เป็นลอยแทนจำนวนเต็มหรือเหวี่ยงให้ลอยเป็นส่วนหนึ่งของการคำนวณ:
SET @weight= CAST(@set1 AS float) / CAST(@set2 AS float);
เมื่อคุณใช้เฉพาะจำนวนเต็มในการหารคุณจะได้รับการหารจำนวนเต็ม เมื่อคุณใช้ (อย่างน้อยหนึ่ง) คู่หรือลอยคุณจะได้รับการแบ่งจุดลอยตัว (และคำตอบที่คุณต้องการได้รับ)
คุณสามารถ
อย่าเพิ่งโยนผลลัพธ์ของการหารจำนวนเต็มให้เป็นสองเท่า: การหารนั้นได้ถูกดำเนินการแล้วเป็นการหารจำนวนเต็มดังนั้นตัวเลขที่อยู่ด้านหลังทศนิยมจะสูญหาย
เพราะมันเป็นจำนวนเต็ม คุณต้องประกาศเป็นตัวเลขทศนิยมหรือทศนิยมหรือโยนเป็นตัวเลขดังกล่าวในการคำนวณ
เพียงแค่แบ่งส่วนล่างของการหารด้วย 1.0 (หรือทศนิยมมากเท่าที่คุณต้องการ)
PRINT @set1
PRINT @set2
SET @weight= @set1 / @set2 *1.00000;
PRINT @weight
หากคุณประกาศว่าเป็นทศนิยมหรือรูปแบบทศนิยมใด ๆ ก็จะแสดง
0
เท่านั้น
เช่น :
declare @weight float;
SET @weight= 47 / 638; PRINT @weight
เอาต์พุต: 0
หากคุณต้องการผลลัพธ์เป็น
0.073667712
เช่น
declare @weight float;
SET @weight= 47.000000000 / 638.000000000; PRINT @weight
ในการแบ่งโดยตรงของ SQL Server ของจำนวนเต็มสองจำนวนจะส่งคืนจำนวนเต็มแม้ว่าผลลัพธ์ควรจะเป็นทศนิยมก็ตาม มีตัวอย่างด้านล่างเพื่อให้เข้าใจ:
--1--
declare @weird_number_float float
set @weird_number_float=22/7
select @weird_number_float
--2--
declare @weird_number_decimal decimal(18,10)
set @weird_number_decimal=22/7
select @weird_number_decimal
--3--
declare @weird_number_numeric numeric
set @weird_number_numeric=22/7
select @weird_number_numeric
--Right way
declare @weird_number float
set @weird_number=cast(22 as float)/cast(7 as float)
select @weird_number
บล็อกสุดท้ายจะส่งคืน 3,14285714285714 แม้ว่าบล็อกที่สองจะกำหนดด้วยความแม่นยำที่เหมาะสมผลลัพธ์จะเป็น 3.00000