Mysql where子句比较为相同值

时间:2018-04-12 06:15:06

标签: mysql

我的mysql版本是5.7.14

我有一张表有两列

1)。具有浮点数据类型的price_val_float

2)。具有双数据类型的price_val_double

表格结构

CREATE TABLE test (
 price_val_float FLOAT(6,2), 
 price_val_double DOUBLE(6,2)
);

两列中的值相同

INSERT INTO test VALUES
(78.59, 78.59), 
(78.60, 78.60), 
(78.61, 78.61);

现在我设置一个变量如下

SET @priceValue=78.6;

现在我想从test table获取所有记录,其中price_val_float> = @priceValue;

SELECT price_val_float FROM test WHERE price_val_float>= @priceValue;

以上查询仅返回 78.61

但是,如果我运行 price_val_double

的相同查询
SELECT price_val_double FROM test WHERE price_val_double>= @priceValue; 

此回归

78.60

78.61

我没有得到为什么mysql会返回不同的结果,因为只有数据类型不同

有人知道吗?

以下是Fiddle用于测试

提前致谢。

4 个答案:

答案 0 :(得分:1)

这可能听起来很奇怪,但这是因为十进制数是近似值。由于存储大数字的性质,这是所有编程中的问题。甚至mysql文档都会调用这些“近似”值: https://dev.mysql.com/doc/refman/5.5/en/floating-point-types.html

例如:MySQL在存储值时执行舍入,因此如果将999.00009插入FLOAT(7,4)列,则大致结果为999.0001。

这在mysql文档中有解释: https://dev.mysql.com/doc/refman/5.5/en/problems-with-float.html

或者作为Python中解释的另一个案例: https://docs.python.org/2/tutorial/floatingpoint.html

解决此问题的方法是确定所需的精度并将值存储为整数。

答案 1 :(得分:0)

Float是单精度,Double是双精度,这就是为什么你能得到差异。

答案 2 :(得分:0)

这种情况正在发生,因为数字之间的差异显示在十进制十分左右左右,具体取决于计算机体系结构或编译器版本或优化级别等因素。例如,不同的CPU可能会以不同方式评估浮点数。

您需要使用DECIMAL数据类型才能获得更准确的结果。另请查看this了解详情

答案 3 :(得分:0)

这是因为Float点值未存储为精确值。如果需要精确值,可以使用十进制数据类型。你可以阅读它here