2012-02-23 191 views
14

FLOAT我有这个疑问:转换int在SQL

SELECT sl.sms_prefix, sum(sl.parts) , cp.country_name, CAST(SUM(sl.parts) AS NUMERIC(10,4)) * CAST(cp.price AS NUMERIC(10,4)) 
FROM sms_log sl, sms_transaction st, country_prefix cp 
WHERE st.customer_id =1 
AND st.sendtime >=1329865200 
AND st.sendtime <=1330037999 
AND st.sms_trans_id = sl.trans_id 
AND sl.sms_prefix = cp.prefix 
AND st.customer_id = cp.customer_id 
GROUP BY sl.sms_prefix 
LIMIT 0 , 30 

结果:

sms_prefix sum(sl.parts)  country_name price total 
================================================================================== 
45   2      Denmark 0.01 0.019999999552965 
63   3      Philippines 2 6 

正如你所看到的"total"是不正确的Denmark因为sum(sl.parts)=2乘以0.01总应该是0.02

价格区域是FLOAT我如何才能将总数浮动?

问候,

回答

19

Oracle数据库中有铸造INT飘起了招(我想,这也应该在MySQL的工作):

select myintfield + 0.0 as myfloatfield from mytable 
+0

感谢heximal,成功,请参阅在原来的岗位 – alkhader 2012-02-23 10:05:02

+1

变化不会忘记算术运算优先级,总和比乘低优先级。 (sum(sl.parts)+0.0)* cp.price会更准确。 – heximal 2012-02-23 10:13:46

+0

是的,我需要在乘法之前发生SUM – alkhader 2012-02-23 10:16:26

28

虽然@ Heximal的答案的作品,我不我个人推荐它。

这是因为它使用明确铸造。虽然您没有键入CAST,但SUM()0.0需要转换为相同的数据类型,才能发生+。在这种情况下,优先顺序对您有利,您可以在两侧获得浮动,并且由于+而获得浮动。但是SUM(aFloatField) + 0不会产生INT,因为0正在隐含转换为FLOAT。

我发现在大多数编程案例中,最好是显式。不要让事情变得偶然,困惑或解释。

如果你想明确,我会使用以下内容。

CAST(SUM(sl.parts) AS FLOAT) * cp.price 


我不会讨论是否NUMERIC或FLOAT(而不是浮点定点)是比较合适的,当它涉及到圆棒的错误,等等。我只是让你认为谷歌如果你需要的话,但是FLOAT如此大量地被滥用,以至于已经有很多关于该主题的内容。

你可以尝试以下,看看会发生什么...

CAST(SUM(sl.parts) AS NUMERIC(10,4)) * CAST(cp.price AS NUMERIC(10,4)) 
+0

Thanks Dems,当我试着CAST(SUM(sl.parts)AS NUMERIC(10,4))* CAST(cp.price AS NUMERIC(10,4))时,它给出了一个语法错误的正确语法来使用'FLOAT ) – alkhader 2012-02-23 10:57:55

+0

@alkhader - 您的代码段不包含单词FLOAT - 因此您需要显示其余的查询。它可能仅仅是前面的语句中缺少的')'或','。 – MatBailie 2012-02-23 11:20:31

+0

谢谢Dems,我用我使用的查询更新了我的原始POST。 – alkhader 2012-02-23 11:30:15