首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在mysql中插入浮点数并查询等式

问如何在mysql中插入浮点数并查询等式
EN

Stack Overflow用户
提问于 2014-02-07 11:14:27
回答 1查看 593关注 0票数 2

Wowee ..does mysql是否可以使用浮点数!

1)我在mysql字段价格= 0.1中插入一个浮点数

2)我运行以下查询:

代码语言:javascript
复制
select * from buy_test where price = 0.1  

哇!我没有得到任何结果

3)我运行以下查询:

代码语言:javascript
复制
select * from buy_test where price < 0.1 

I get no results

4)我运行以下查询

代码语言:javascript
复制
 select * from buy_test where price > 0.1 

耶!我得到了结果,但不是..我想要价格=0.1的地方

如何在mysql中插入浮点数,以便在mysql中查询浮点数

谢谢

代码语言:javascript
复制
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$$
EN

回答 1

Stack Overflow用户

发布于 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。

当引擎进行比较时,它导致:

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21618600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档