WHERE子句中的SQL Server浮点

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)