我的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用于测试
提前致谢。
答案 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