数据库中慎用float数据类型
 
大多数编程语言都支持float或者double的数据类型。而数据库中也有相同关键字的数据类型,因此很多开发人员也自然而然地在需要浮点数的地方使用float作为字段类型。  www.2cto.com  
 
但事实上是否float可以适用于所有的业务场景呢?
 
float类型是根据IEEE 754标准使用二进制格式编码实数数据,对于一些小数,比如59.95,float类型会存储了二进制中最接近59.95的值,用十进制表示等于59.950000762939。
当然,有些数据库能够通过某种方式弥补这种数据的不精确性,查询结果在时候可以输出我们所期望的值。
如下面所示:
 
Sql代码  
select  rate from t_refresh where  id  =1;  
  
Returns:59.95  
 但是,如果将这个值扩大十亿倍:  www.2cto.com  
 
Sql代码  
select  rate * 1000000000 from t_refresh where  id  =1;  
  
Return:59950000762.939  
 
这可能和你期望的结果59950000000.000不太一样了。
在上面在例子中,误差在千万分之一内,对于部分的运算来说已经足够了。
然而,在某些运算中,这样的误差是不能容忍的,如比较的操作:
Sql代码  
select  *  from t_refresh where rate  = 59.95  
  
Result:empty set;no rows match,  
 
因为rate的实际存储值是比59.95大一点点。
又如在金融项目中计算复利,需要进行多次浮点数乘法运算,使用float类型会导致误差不断累积。
   www.2cto.com  
因此,在某些业务场景中,我们需要用numeric或者decimal来代替float数据类型。
 
和float类型相比,numeric和decimal存储的是精确值,如果你insert进去的是一个59.95,实际存的也是59.95。
所以在上面在例子中,如果用numeric或者decimal
Sql代码  
select  rate * 1000000000 from t_refresh where  id  =1;  
  
Return:59950000000  
 
Sql代码  
select  id  from t_refresh where rate  = 59.95  
  
Return:1  
 
结论:
 
float适用于精度要求低,   数值范围大的科学运算场景

金融、统计等精度要求高的场景,则需要用numeric或者decimal

最新文章

  1. mongoVUE的增删改查操作使用说明
  2. jenkins插件开发-此路是我开
  3. jQuery 复合选择器的几个例子
  4. 【T-SQL系列】FOR XML PATH 语句的应用
  5. 权限控制框架Shiro简单介绍及配置实例
  6. iOS 复杂tableView的 cell一般设计思路
  7. ubuntu更新源,简单两步搞定
  8. [.Net MVC] 使用SQL Server数据库代替LocalDb
  9. poj 4618 暴力
  10. iOS 使用UILocalizedIndexedCollation实现区域索引标题(Section Indexed Title)即拼音排序
  11. 浅析JQuery中的html(),text(),val()区别
  12. Google出品的自动Web安全扫描程序 Skipfish 下载及安装使用方法
  13. 为什么使用 Containjs 模块化管理工具效率高?
  14. 初遇stm32
  15. JAVAEE学习——struts2_02:结果跳转方式、访问servletAPI方式、获得参数以及封装和练习:添加客户
  16. HDU6127Hard challenge
  17. duilib界面库学习(仿PC微信界面,有服务器,有数据库,可以网络通信)
  18. AutoMapper 使用心得
  19. Appium-处理系统弹窗
  20. AngularJS使用ngMessages进行表单验证

热门文章

  1. vscode template中设置不换行
  2. Java之线程通信的方法
  3. 理论优美的深度信念网络--Hinton北大最新演讲
  4. 如何决定 Web 应用的线程池大小
  5. Codeforces Round #600 (Div. 2)E F
  6. 蓝桥杯练习Day 2
  7. 【Java杂货铺】JVM#Java高墙之内存模型
  8. Flume(二) —— 自定义拦截器、Source、Sink
  9. Python数据分析与展示第0&1周学习笔记(北理工 嵩天)
  10. 量化投资_MATLAB在时间序列建模预测及程序代码