`
El_Nino
  • 浏览: 205089 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

数据库中慎用float数据类型

阅读更多

大多数编程语言都支持float或者double的数据类型。而数据库中也有相同关键字的数据类型,因此很多开发人员也自然而然地在需要浮点数的地方使用float作为字段类型。

 

但事实上是否float可以适用于所有的业务场景呢?

 

float类型是根据IEEE 754标准使用二进制格式编码实数数据,对于一些小数,比如59.95,float类型会存储了二进制中最接近59.95的值,用十进制表示等于59.950000762939。

当然,有些数据库能够通过某种方式弥补这种数据的不精确性,查询结果在时候可以输出我们所期望的值。

如下面所示:

 

select  rate from t_refresh where  id  =1;

Returns:59.95

 但是,如果将这个值扩大十亿倍:

 

select  rate * 1000000000 from t_refresh where  id  =1;

Return:59950000762.939

 

这可能和你期望的结果59950000000.000不太一样了。

在上面在例子中,误差在千万分之一内,对于部分的运算来说已经足够了。

然而,在某些运算中,这样的误差是不能容忍的,如比较的操作:

select  *  from t_refresh where rate  = 59.95

Result:empty set;no rows match,

 

因为rate的实际存储值是比59.95大一点点。

又如在金融项目中计算复利,需要进行多次浮点数乘法运算,使用float类型会导致误差不断累积。

 

因此,在某些业务场景中,我们需要用numeric或者decimal来代替float数据类型。

 

和float类型相比,numeric和decimal存储的是精确值,如果你insert进去的是一个59.95,实际存的也是59.95。

所以在上面在例子中,如果用numeric或者decimal

select  rate * 1000000000 from t_refresh where  id  =1;

Return:59950000000

 

select  id  from t_refresh where rate  = 59.95

Return:1

 

结论:

 

float适用于精度要求低,   数值范围大的科学运算场景

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

分享到:
评论

相关推荐

    DB2数据库相关操作笔记很实用-数据备份,数据还原,定时备份等

    1. 注意事项 2. 数据库安装 ——2.1 DB2 Express-C Version 11.1 下载 ——2.2 数据库安装步骤 ...—— 6.3 慎用【频繁的停止数据库】 7. 数据库完全卸载 —— 7.1 卸载注意事项 —— 7.2 卸载DB2数据库

    机器学习前端,没有hbase数据库结构和scala的算法jar包,慎用

    "机器学习前端,没有HBase数据库结构和Scala的算法jar包,慎用"这一标题提示我们,对于一个涉及机器学习的项目,如果前端缺少了特定的后端支持,可能会遇到重大挑战。在这个场景中,HBase数据库和Scala编写的算法库...

    数据库的优化

    5. **自增字段慎用**:自增字段虽然简单易用,但在分布式环境下可能会带来问题。 6. **使用定长数据类型**:相较于变长数据类型,定长类型在更新时不会引起页拆分,有利于提高查询性能。 #### 六、总结 数据库优化...

    19个城市群地级市数据库更新到2021年已经划分好的dta和excel数据185变量直接可以用

    19个城市群地级市数据库更新到1990-2021年已经划分好每个城市群的dta和 ...excel中数据用回归法全部补齐,有些缺失 严重的慎用,可对照表中有效值统计,选择原始数据有效值比重高的使用。共186个变量 ,来自历年城市统

    MDB数据库修复工具

    标题中的“MDB数据库...因此,“慎用”提醒用户在操作前要谨慎,确保有备份以防止不可逆的数据损失。总的来说,MDB数据库修复工具是IT专业人士在面对ACCESS数据库问题时的重要工具,但使用时需谨慎并遵循正确的流程。

    orcl数据库中的递归方法

    ---注意我用的数据库是orcl数据库--- ----建表语句 ----数据库数据 ...注意要慎用,弄不好不数据库能弄挂掉了,下载模仿写的时候一定不要写成死循环,要不自己机器还好,服务器的话。。。。嘿嘿。。

    数据库开发规范

    - **解释**:ENUM类型虽然可以简化数据输入,但其灵活性较低,不建议在业务场景中使用。 7. **尽可能把所有列定义为NOT NULL** - **解释**:NULL值可能会导致查询和计算变得复杂,尽可能避免使用NULL值可以简化...

    Redis切换数据库的详细介绍.zip

    - **数据隔离**:不同类型的键可以分布在不同的数据库中,比如一个数据库用于存储用户信息,另一个数据库用于存储商品数据。 - **测试与生产环境**:开发环境中可以使用非0数据库进行测试,避免影响生产数据。 - ...

    加密的惨剧!慎用文件夹加密软件!

    加密的惨剧!慎用文件夹加密软件! 加密的惨剧!慎用文件夹加密软件!

    提高数据库查询效率

    3. **IN与NOT IN的慎用**:对于非连续的数值集合,IN与NOT IN可能导致全表扫描。对于连续数值,推荐使用BETWEEN代替IN。 4. **LIKE操作符的限制**:使用LIKE操作符时,如果模式前缀为通配符(如'%abc%'),将导致全...

    怎样提高数据库查询效率

    14. 并不是所有索引对查询都有效,SQL 是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL 查询可能不会去利用索引。 15. 索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了...

    SQL Server数据库性能的优化.pdf

    "SQL Server数据库性能优化" SQL Server数据库性能的优化是数据库应用系统开发中的一个重要...合理的数据库设计、慎用游标、索引的使用、查询优化、数据库碎片整理、数据库备份和恢复等都是数据库性能优化的重要手段。

    暴力删除一切顽固文件,慎用!

    把要删除的文件拖到这个文件上面即可。注意,这是强力删除。一定慎用,因为连垃圾箱都会没有的。

    数据库SQL优化大总结 百万级数据库优化方案

    在数据库设计中,尽量避免使用NULL值,特别是在where子句中对字段进行NULL值判断。这样可以避免引擎放弃使用索引而进行全表扫描。可以使用NOT NULL约束来确保字段不为空。 三、避免使用!=或操作符 在where子句中,...

    sql数据库优化方法

    - **注意数据类型匹配**:连接操作时,确保数据类型匹配,避免隐式转换带来的性能损失。 - **慎用视图**:虽然视图方便了查询,但过度使用可能导致性能下降,尤其是复杂视图。 - **避免DISTINCT和ORDER BY**:...

    2022年电大数据库思考与练习题.doc

    数据字典(Data Dictionary,简记 DD),是对数据流程图中数据流和存储结构的描述。在数据库应用系统设计中,数据字典是表、视图设计的主要依据。 七、需求分析阶段的主要任务和目的 需求分析阶段的主要目的是回答...

    MySQL 数据库设计优化完善版本.doc

    * 自增字段要慎用,不利于数据迁移。 数据库物理存储和环境的设计 在设计阶段,可以对数据库的物理存储、操作系统环境、网络环境进行必要的设计,使得我们的系统在将来能适应比较多的用户并发和比较大的数据量。...

    提高SQL处理查询上百万条数据库的速度

    13. 并不是所有索引对查询都有效,SQL 是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL 查询可能不会去利用索引。 索引并不总是对查询有效,应该根据实际情况选择合适的索引,以提高查询速度。 14...

Global site tag (gtag.js) - Google Analytics