pti*_*flo 6 sql sql-server floating-point
我正在尝试查询数据库,我需要获得一个客户列表,其权重等于60.5.问题是60.5是一个真实的我以前从未在where子句中使用real查询数据库.
我试过这个:
SELECT Name FROM Customers WHERE Weight=60.5
SELECT Name FROM Customers WHERE Weight=cast(60.5 as real)
SELECT Name FROM Customers WHERE Weight=cast(60.5 as decimal)
SELECT Name FROM Customers WHERE Weight=convert(real,'60.5')
SELECT Name FROM Customers WHERE Weight=convert(decimal,'60.5')
Run Code Online (Sandbox Code Playgroud)
这些查询返回0值,但在Customers表中,它们是10行,权重= 60.5
Ami*_*mit 15
您的问题是浮点数根据定义是不准确的.比较看起来像60.5到60.5的文字可能不会像你注意到的那样起作用.
一个典型的解决方案是测量2个值之间的差异,如果它小于某个预定义的epsilon,则认为它们相等:
SELECT Name FROM Customers WHERE ABS(Weight-60.5) < 0.001
Run Code Online (Sandbox Code Playgroud)
为了获得更好的性能,您应该使用:
SELECT Name FROM Customers WHERE Weight BETWEEN 64.999 AND 65.001
Run Code Online (Sandbox Code Playgroud)