数据库中慎用float数据类型(转载)

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

时间: 2024-10-15 14:22:38

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

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

将数据库中存储时间的数据类型改为varchar(),这时最好让这些时间是数据库中自动生成的(一个没有格式的输入也可能会导致输出错误),因为存储类型为varchar(),所以获取到的值也就被认为是一个字符串,直接将数据库中的时间字符串进行转化(这时那些转化函数是能识别数据库中的时间函数的),客户端的时间格式不再影响转换过程. 不过数据库中存储时间的类型如果为字符型也会带来一些麻烦: 数据库中的时间仅仅是用来显示.查找的,那么影响还不算大,但如果对时间字段进行一些算法如计算星期.DateDiff.D

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

数据库中字段类型对应C#中的数据类型: 数据库                 C#程序 int int32 text string bigint int64 binary System.Byte[] bit Boolean char string datetime System.DateTime decimal System.Decimal float System.Double image System.Byte[] money   System.Decimal nchar String n

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

数据库中字段类型对应C#中的数据类型: 数据库                 C#程序 int int32 text string bigint int64 binary System.Byte[] bit Boolean char string datetime System.DateTime decimal System.Decimal float System.Double image System.Byte[] money   System.Decimal nchar String n

查询数据库语句报错“数据类型 text 和 varchar 在 equal to 运算符中不兼容。"

问题:查询数据库语句报错"数据类型 text 和 varchar 在 equal to 运算符中不兼容." 解决: select * from 表名称 where cast(查询的字段名称 as varchar(max)) ='查询的值'

PDO 拿出來的 Float 數據跟数据库中的数据不匹配

数据库中的价格字段是 float 类型的,在 Laravel 中取出会出现这样的情况 数据库:71.9 -> 程序打印:72.0 数据库:75.2 -> 程序打印:75.3 在另外一个测试环境是没有问题的,请问是 PDO 要设置什么? PDO 拿出來的 Float 數據跟数据库中的数据不匹配 >> mysql 这个答案描述的挺清楚的:http://www.goodpm.net/postreply/mysql/1010000007441481/PDO拿出來的Float數據跟数据库中的

PostgreSQL、SQL Server数据库中的数据类型的映射关系

PostgreSQL 8.1 轰动发布,我也打算将原来使用 SQL Server 的一些应用迁移到 PostgreSQL 上,首先需要迁移的是表,那么这就必须要先搞清楚这两个数据库中的数据类型的映射关系.查了下 PostgreSQL 文档特制作如下对应表格,以飨各位. 注意:PostgreSQL 中的 money(货币)数据类型现在已经废弃,用 numeric 或 decimal 以及和 to_char 函数一起使用就可以取代它. SQL Server 中的 datetime.smalldate

获取数据库中用户表所有列和列的数据类型

获取数据库中,所有用户表中每一列名和其数据类型. SELECT OBJECT_NAME(c.OBJECT_ID) AS [Table_Name], c.[name] AS [Column_Name] ,t.[name] AS [Data_Type_Name] FROM sys.columns AS c LEFT JOIN SYSOBJECTS AS s ON (c.[object_id] = s.[id]) LEFT JOIN sys.types AS t ON (c.[user_type_id

B树在数据库索引中的应用剖析(转载)

引言 关于数据库索引,随便Google一个Oracle index,Mysql index总有大量的结果出来,其中不乏某某索引之n条经典建议.笔者认为,较之借鉴,在搞清楚了自己的需求的基础上,对备选方案的原理有个尽可能深入全面的了解会更有利于我们的选择和决策.因为某种方案或者技术呈现出某种优势(包括可能没有被介绍到但一定存在的限制),不是定义出来的,而是因为其实现机制决定的.就像LinkedList和ArrayList分别适用于什么应用不是Document里面定义的,是由其本身的结构决定的.数据

Java实现Excel导入数据库,数据库中的数据导入到Excel。。转载

自学资料总结 实现的功能: Java实现Excel导入数据库,如果存在就更新 数据库中的数据导入到Excel 1.添加jxl.jar mysql-connector-java.1.7-bin.jar包到项目的lib目录下­ 2.Excel文件目录:D://book.xls 3.数据库名:javenforexcel 4.表名:stu 5.编写类:连接mysql的字符串方法.插入的方法.实体类­­ 表结构如下 : 连接数据库的工具类 package com.javen.db; import java