2

这似乎是一个非常奇怪的问题,我似乎无法深究原因。运行 mysql select 语句时,我们一直没有返回任何结果,但只有当值达到引用的 '7.56' 时。如果我们在没有引号的情况下运行相同的查询或使用不同的数字,它会按预期工作。下面的示例查询和结果:

SELECT * 
FROM  `orders` 
WHERE  `itemsTotal` =  '7.56'
LIMIT 0 , 30

MySQL 返回一个空的结果集(即零行)。(查询耗时 0.0334 秒)

SELECT * 
FROM  `orders` 
WHERE  `itemsTotal` = 7.56
LIMIT 0 , 30

Showing rows 0 - 0 ( 1 total, Query took 0.0297 sec)

现在,如果您将项目总数更改为 7.57:

SELECT * 
FROM  `orders` 
WHERE  `itemsTotal` =  '7.57'
LIMIT 0 , 30

Showing rows 0 - 0 ( 1 total, Query took 0.0280 sec)

SELECT * 
FROM  `orders` 
WHERE  `itemsTotal` = 7.57
LIMIT 0 , 30

Showing rows 0 - 0 ( 1 total, Query took 0.0284 sec)

这是在本地主机上运行 mysql 5.5.24 进行测试,在实时环境中运行 mysql 5.0.95。从 PHP 文件和 phpmyadmin 运行此查询时,结果相同。如果有人能发现明显的错误,请告诉我!

4

1 回答 1

4

您比较的问题是float precision。由于浮点数据类型近似表示值,因此在常见情况下您不能依赖严格比较。这就是为什么你可以得到结果的原因是你直接将你的值转换为字符串,但如果你试图比较浮点数则不行。

因此,您7.56的表示7.55999999999例如 - 不能通过严格比较作为浮点数找到,但可以通过比较作为字符串找到。有关详细信息,请参阅“浮动比较”部分。

为了解决这个问题 - 通常的解决方案是涉及精度增量并将值与

SELECT * 
FROM  `orders` 
WHERE  ABS(`itemsTotal` - 7.56) < 1E-12
LIMIT 0 , 30

-这1E-12是那个三角洲。

于 2013-09-18T10:46:18.020 回答