数据库中慎用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

数据库中慎用float数据类型(转载)的更多相关文章

  1. MYSQL数据库中,常见的数据类型有哪些?它们与java中的数据类型如何对应

    A.常规 映射 integer 或者 int int 或者 java.lang.Integer INTEGER 4 字节 long long Long BIGINT 8 字节 short short  ...

  2. 数据库中字段的数据类型与JAVA中数据类型的对应关系

    类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述             VARCHAR L+N VARCHAR java.lang.String 12   CHAR N ...

  3. MySQL数据库中几种数据类型的长度

    在MySQL里新建表自然会涉及设置字段长度,但有时会发现长度限制在一些字段类型中不起作用?字段长度是按字节算还是字符算? 如图中:int看起来只要还在本身类型取值范围内就行,字段长度没有起到作用:而c ...

  4. 数据库中float类型字段,转化到前端显示,统一保留两位小数

    客户的一个需求,mybatis查询到的数据库的数据进行转换,采用TypeHandler<T>的方式.float保留两位精度可以采用DecimalFormat 直接贴上最终的解决代码(事情没 ...

  5. MySQL数据库笔记二:数据类型及数据库操作

    三.MySQL数据库数据类型 MySQL数据库中支持多种数据类型:数值型.字符型.日期型 常用的数据类型: 1.整型 int:整形,存储整数 int(M):M表示预期值.与存储大小和数值的范围无关. ...

  6. 数据库中存储日期的字段类型究竟应该用varchar还是datetime ?

    背景: 前段时间在百度经验看到一篇文章<如何在电脑右下角显示你(爱人)的名字>,之前也听过这个小技巧,但没真正动手设置过.所以出于好奇就实践了一下. 设置完成后的效果例如以下.右下角的时间 ...

  7. 数据库中存储日期的字段类型到底应该用varchar还是datetime

    将数据库中存储时间的数据类型改为varchar(),这时最好让这些时间是数据库中自动生成的(一个没有格式的输入也可能会导致输出错误),因为存储类型为varchar(),所以获取到的值也就被认为是一个字 ...

  8. 数据库中字段类型对应的C#中的数据类型(转载)

    数据库中字段类型对应C#中的数据类型: 数据库                 C#程序 int int32 text string bigint int64 binary System.Byte[] ...

  9. 数据库中字段类型对应的C#中的数据类型

    数据库中字段类型对应C#中的数据类型: 数据库                 C#程序 int int32 text string bigint int64 binary System.Byte[] ...

随机推荐

  1. PAT Advanced 1097 Deduplication on a Linked List (25) [链表]

    题目 Given a singly linked list L with integer keys, you are supposed to remove the nodes with duplica ...

  2. python学习笔记-函数与可变长参数

    一.函数 1. def test(x): y=x+1 return yprint(test) #这是打印函数在内存中的地址 过程:就是没有返回值的函数 在python中过程也是函数,就算没哟返回值,也 ...

  3. Java web之jsp,xml(2020.1.7)

    1.xml文档规则 xml声明 字符集 xml元素的基本规则: 合法标签名 嵌套子元素 空元素

  4. [Python]安装和运行flask框架

    随着你的 Python 项目越来越多,你会发现不同的项目会需要 不同的版本的 Python 库.同一个 Python 库的不同版本可能不兼容.虚拟环境可以为每一个项目安装独立的 Python 库,这样 ...

  5. 洛谷P1525 关押罪犯(并查集、二分图判定)

    本人蒟蒻,只能靠题解AC,看到大佬们的解题思路,%%%%%% https://www.luogu.org/problemnew/show/P1525 题目描述 S城现有两座监狱,一共关押着N名罪犯,编 ...

  6. anaconda学习笔记

    anaconda介绍 Anaconda指的是一个开源的Python发行版本,其包含了conda.Python等180多个科学包及其依赖项. Conda是一个开源的包.环境管理器,可以用于在同一个机器上 ...

  7. shell时间函数

    function getlastday(){ if [ $# -lt 2 ]; then echo "usage: getlastday month dayofweek" echo ...

  8. A brief introduction to complex analysis

    \(\underline{Def:}\)A func \(U(\subset \mathbb{C}) \stackrel{f}\longrightarrow \mathbb{C}\)is (compl ...

  9. 引力波的绘制(python)

    import numpy as np import matplotlib.pyplot as plt from scipy.io import wavfile rate_h,hstrain = wav ...

  10. CNN Mini-Fashion数据集以及Pytorch初体验

    下载Fasion-MNIST数据集 Fashion-MNIST是一个替代原始的MNIST手写数字数据集的另一个图像数据集. 它是由Zalando(一家德国的时尚科技公司)旗下的研究部门提供.其涵盖了来 ...