Wowee ..does mysql是否可以使用浮点数!
1)我在mysql字段价格= 0.1中插入一个浮点数
2)我运行以下查询:
select * from buy_test where price = 0.1 哇!我没有得到任何结果
3)我运行以下查询:
select * from buy_test where price < 0.1
I get no results4)我运行以下查询
select * from buy_test where price > 0.1 耶!我得到了结果,但不是..我想要价格=0.1的地方
如何在mysql中插入浮点数,以便在mysql中查询浮点数
谢谢
CREATE TABLE `buy_test` (
`user_id` varchar(45) DEFAULT NULL,
`order_id` varchar(100) NOT NULL,
`price` float DEFAULT NULL,
`insert_time` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1$$发布于 2015-04-29 19:45:23
这是因为0.1不存在于浮点算术中。以二进制格式打印0.1的实际值需要无穷多个数字(就像打印10/3的实际值需要无穷多个数字一样)。
在您的表中,您使用一个'float‘类型存储价格,该类型以32位表示。值0.1舍入为0.100000001490116119384765625 (这是浮点型格式中0.1的最接近表示形式)。
当您请求价格等于0.1的所有行时,我强烈怀疑解释器使用double类型,或者至少是比float更精确的类型。但让我们考虑一下它在64位上使用双精度类型。在double类型中,0.1舍入为0.1000000000000000055511151231257827021181583404541015625。
当引擎进行比较时,它导致:
if (0.100000001490116119384765625 ==
0.1000000000000000055511151231257827021181583404541015625) ...这显然是错误的。但对于运算符>是正确的。
我非常确定where子句会起作用:"where price = 0.100000001490116119384765625“
顺便说一下,当您的查询结果告诉您价格是"0.1“时,这是一个谎言。该值被舍入为“漂亮的显示”。
你的问题没有真正的解决方案,每个知道浮点算术问题的人都会阻止你在浮点数上使用相等比较。您可以使用epsilon来处理您的请求。
有一篇非常有趣的文章,名为“每个计算机科学家都应该知道浮点算术”;你可以在那里找到它:http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
https://stackoverflow.com/questions/21618600
复制相似问题