mysql double类型查询不到记录的问题

查询举例(mysql8):

字段类型是double(8,2),值是1.14和1.82,这条记录id是1的话:

##id能直接查出来
select * from `table` where `id` = 1;
#直接查字段的值查不出来
select * from `table` where `column` = 1.82;
select * from `table` where `column` = 1.14;

而且id查出来打印也可能出现

1.14打印出来的值是:1.1400000000000001

1.82打印出来的值是:1.8199999999999998

换成float(8,2) 或者decimal(8,2)都可以,但是float是单精度,所以一般情况下建议用decimal,或者乘以100存整数, 或者查询的数据加上引号应该可以,没测

 

下面是转自:https://www.cnblogs.com/tusheng/articles/9389672.html

 

怎么样才能存储一个准确的数据

如果采用float或者double类型的话,数据有时候完全准确的,有时候是不准确的,怎么才能存储一个准确的数字,完全看你需要存什么样的数据,假如存储一个8.25这样的数字,那永远都是准确的。但是如果存储0.9这样的数字,则永远存不准确。

所以如果一个实数在MySQL中存储准确的话,会出现以下三种情况

  1. 数据真的准确,数据能在有限的存储空间里完全存储起来
  2. 数据存储被截断,但是通过四舍五入依然能够将数据显示准确
  3. 数据存储被截断,通过四舍五入不能将数字正确显示

关于decimal类型

通过前面的分析,了解了float和double类型的区别和误差来源。但是decimal类型是MySQL官方唯一指定能精确存储的类型,也是DBA强烈推荐和金钱相关的类型都要存储为decimal类型,如果猜想decimal类型的存储格式的话,那么一下两种可以保持数据的准确性

  1. 继续扩大存储空间,比double更大一个级别,比如128位甚至更多
  2. 通过字符串化或者其他的方式特殊存储起来

这两种方式都能实现decimal精确存储,但是由于MySQL指定decimal类型最大长度为65.在我们能测试的范围内,decimal并没有出现误差。作为MySQL官方唯一指定精确存储的decimal类型,后续有精力再研究为什么能做到精确todo

如何选择float,double,decimal

结论总是放在最后,根据上面的分析:可以得出以下结论 
1 如果你要表示的浮点型数据转成二进制之后能被32位float存储,或者可以容忍截断,则使用float,这个范围大概为要精确保存6位数字左右的浮点型数据 
比如10分制的店铺积分可以用float存储,小商品零售价格(1000块之内)

2 如果你要表示的浮点型数据转成二进制之后能被64位double存储,或者可以容忍截断,这个范围大致要精确到保存13位数字左右的浮点型数据 
比如汽车价格,几千万的工程造价

3 相比double,已经满足我们大部分浮点型数据的存储精度要求,如果还要精益求精,则使用decimal定点型存储 
比如一些科学数据,精度要求很高的金钱

写在最后

理论上的东西永远比不上实践,应用场景大于一切理论。选择float或者double或者decimal有时候也要看场景,比如我们可以用double存储一个小商铺的季度营业额(几千万),单独用double存储的时候没有问题,当多个季度,多个年份算总3年内的营业额是,就会出现问题,再也算不出一个准确的答案。所以,如果考虑情况没那么有把握的情况下,推荐使用decimal,最后,也可以通过其他手段避开这些问题,比如存储商品价格可以使用 乘于100的形式存储,展示价格的时候再除于100[完]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值