SQL Server การหารคืนค่าศูนย์


87

นี่คือรหัสที่ฉันใช้ในตัวอย่าง:

 PRINT @set1
 PRINT @set2

 SET @weight= @set1 / @set2;
 PRINT @weight

นี่คือผลลัพธ์:

47
638
0

ฉันอยากรู้ว่าทำไมมันถึงกลับมา0แทนที่จะเป็น0,073667712


มันคือ 'int': DECLARE @weight INT
Roch

คำตอบ:


156

ประกาศ set1 และ set2 เป็นลอยแทนจำนวนเต็มหรือเหวี่ยงให้ลอยเป็นส่วนหนึ่งของการคำนวณ:

SET @weight= CAST(@set1 AS float) / CAST(@set2 AS float);

24

เมื่อคุณใช้เฉพาะจำนวนเต็มในการหารคุณจะได้รับการหารจำนวนเต็ม เมื่อคุณใช้ (อย่างน้อยหนึ่ง) คู่หรือลอยคุณจะได้รับการแบ่งจุดลอยตัว (และคำตอบที่คุณต้องการได้รับ)

คุณสามารถ

  1. ประกาศตัวแปรหนึ่งหรือทั้งสองตัวแปรเป็น float / double
  2. ร่ายตัวแปรหนึ่งหรือทั้งสองตัวแปรให้ลอย / คู่

อย่าเพิ่งโยนผลลัพธ์ของการหารจำนวนเต็มให้เป็นสองเท่า: การหารนั้นได้ถูกดำเนินการแล้วเป็นการหารจำนวนเต็มดังนั้นตัวเลขที่อยู่ด้านหลังทศนิยมจะสูญหาย


4
+1 เพราะฉันคิดว่าคุณอธิบายได้ดีกว่าเล็กน้อยและบอกว่าต้องมีค่าเพียงค่าเดียวเท่านั้นที่ต้องเป็น float / double
Chaulky

11

เพราะมันเป็นจำนวนเต็ม คุณต้องประกาศเป็นตัวเลขทศนิยมหรือทศนิยมหรือโยนเป็นตัวเลขดังกล่าวในการคำนวณ


ถ้าฉันเปลี่ยนตัวแปร @weight เป็น float จะเพียงพอหรือไม่?
รอช

10

เพียงแค่แบ่งส่วนล่างของการหารด้วย 1.0 (หรือทศนิยมมากเท่าที่คุณต้องการ)

PRINT @set1 
PRINT @set2 
SET @weight= @set1 / @set2 *1.00000; 
PRINT @weight

ขอบคุณคน รหัสของคุณช่วยฉันตอบคำถามนี้ - stackoverflow.com/questions/20532187/… คุณช่วยบอกฉันได้ไหมว่าจะตัดค่าศูนย์พิเศษที่เกิดจากการคูณนั้นได้อย่างไร ขอบคุณ.
Trojan.ZBOT

2

หากคุณประกาศว่าเป็นทศนิยมหรือรูปแบบทศนิยมใด ๆ ก็จะแสดง

0

เท่านั้น

เช่น :

declare @weight float;

SET @weight= 47 / 638; PRINT @weight

เอาต์พุต: 0

หากคุณต้องการผลลัพธ์เป็น

0.073667712

เช่น

declare @weight float;

SET @weight= 47.000000000 / 638.000000000; PRINT @weight

อืมโอเคฉันเข้าใจแล้ว แต่ตัวเลขสองตัวที่ฉันต้องการหารเป็นตัวแปรและดูเหมือนว่าจะใช้ไม่ได้ถ้าไม่มีการระบุ. 0000 ในตัวแปร

ดังนั้นคุณต้องหล่อทั้ง @ set1 และ @ set2 ให้ลอย :)
anishMarokey

1

ในการแบ่งโดยตรงของ 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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.