在进行金融财务等数值运算时,请使用decimal 类型,不要使用float和double类型!因为decimal的精度最高

如下C#代码:

float a = 0.65f;

float b = 0.6f;

float c = a - b;

此时c为多少?

0.05?错误!

此时c为0.0499999523!

为什么?

其根本原因是计算机所使用二进制01代码无法准确表示某些带小数位的十进制数据。

下面我们来分析下:

我们知道将一个十进制数值转换为二进制数值,需要通过下面的计算方法:

1. 整数部分:连续用该整数除以2,取余数,然后商再除以2,直到商等于0为止。然后把得到的各个余数按相反的顺序排列。简称"除2取余法"。

2. 小数部分:十进制小数转换为二进制小数,采用"乘2取整,顺序排列"法。用2乘以十进制小数,将得到的整数部分取出,再用2乘余下的小数部分,然后再将积的整数部分取出,如此进行,直到积中的小数部分为0或者达到所要求的精度为止。然后把取出的整数部分按顺序排列起来,即先取出的整数部分作为二进制小数的高位,后取出的整数部分作为低位有效位。简称"乘2取整法"。

3. 含有小数的十进制数转换成二进制,整数、小数部分分别进行转换,然后相加。

例如:将十进制数值25.75转换为二进制数值,步骤如下:

25(整数部分)

25/2=12......1

12/2=6.......0

6/2=3......0

3/2=1......1

1/2=0......1

(25) 10=(11001) 2

0.75(小数部分)

0.75*2=1.5......1

0.5*2=1......1

(0.75) 10=(0.11) 2

(25.75) 10=(11001) 2+(0.11) 2=(11001.11) 2

按照上述方法,我们将0.65及0.6转换为二进制代码:

(0.65)10 = (0.101001100110011001100110011001100110011......)2

(0.6) 10 = (0.10011001100110011001100110011001100110011......)2

后面的省略号表示已经算不完了,后面在无限重复 0011 这段二进制数值。

文章开始部分,我们用的float类型,下面我们来看看float类型是否能存储上面转换出的二进制代码。

目前计算机上存储浮点数值是按照IEEE(电气和电子工程师协会)754浮点存储格式标准来存储的。

IEEE单精度浮点格式共32位,包含三个构成字段:23位小数f,8位偏置指数e,1位符号s。将这些字段连续存放在一个32位字里,并对其进行编码。其中0:22位包含23位的小数f; 23:30位包含8位指数e;第31位包含符号s。如下图所示:

也就是说上面将0.65及0.5转换出的二进制代码,我们只能存储23位,即使数据类型为double,也只能存储52位,这样大家便能看出问题出现的原因了。

截取的二进制代码已无法正确表示0.65及0.5,根据这个二进制代码肯定无法正确得到结果0.05。

如何解决这个问题?知道其根本原因后,我们知道是无法从根本上解决这个问题的,但我们可以有一些曲线救国的方法,下面列举几个:

1. 因为二进制数值可以准确表示整数(可以使用整数转换为二进制方法验证下),所以可以将小数乘以10或100等变成整数,然后做整数运算,最后再通过除以10或100等获得结果;

2. 通过截取结果的有效小数位数等,来取得最好的近似结果,然后在做处理。

3. 对于可以用有限长度的二进制数值表示的十进制数值,可以使用存储位数大于其长度的数据类型。

解决方案正在补充中……,若各位有什么好的方法也可以提出来!

以上解决方案需要按照使用的实际情况来决定使用哪种方法。

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

mysql 取 浮点运算_mysql 浮点型运算误差原因分析及解决方法相关推荐

  1. 【javascript】浮点数运算问题分析及解决方法

    问题: 在用 js 进行小数四则运算时发现了一个重大问题,比如:0.7 * 0.8 = 0.5599999999999999 分析: 在 js 中只有一种数字类型 Number,而且在 js 中所有的 ...

  2. mysql全模糊_MySQL文模糊检索问题的解决方法

    在 MySQL 下,在进行中文模糊检索时,经常会返回一些与之不相关的 记录,如查找 "-0x1.ebea4bfbffaacp-4%" 时,返回的可能有中文字符,却没有 a 字符存在 ...

  3. mysql.sock 误删_MySQL sock 文件丢失被删除解决方法 雪剑无影

    Mysql有两种连接方式: (1),TCP/IP (2),socket 对mysql.sock来说,其作用是程序与mysqlserver处于同一台机器,发起本地连接时可用. 例如你无须定义连接host ...

  4. mysql 显示表情符号_mysql 支持emoji 表情字符的解决方法。

    1.utf8 字符集最多3个字符,而emoji表情字符是unicode大字符集,需要4个字节表示,所以utf8无法表示. mysql要存储emoji字符,需要设成utf8mb4字符集,意思就是utf8 ...

  5. mysql还原1418错误_MySQL 出现错误1418 的原因分析及解决方法

    MySQL 出现错误1418 的原因分析及解决方法 具体错误: 使用mysql创建.调用存储过程,函数以及触发器的时候会有错误符号为1418错误. ERROR 1418 (HY000): This f ...

  6. mysql 资源占用过高分析和解决方法

    mysql 资源占用过高分析和解决方法 参考文章: (1)mysql 资源占用过高分析和解决方法 (2)https://www.cnblogs.com/luoa/p/10422210.html 备忘一 ...

  7. MySQL This function has none of DETERMINISTIC, NO SQL...错误1418 的原因分析及解决方法

    原因分析: 因为CREATE PROCEDURE, CREATE FUNCTION, ALTER PROCEDURE,ALTER FUNCTION,CALL, DROP PROCEDURE, DROP ...

  8. 连接MySQL数据库时常见故障问题的分析与解决

    连接MySQL数据库时常见故障问题的分析与解决 初学的mysql网友好象经常会碰到mysql无法连接的错误.特开贴收集这样问题的现象和原因. 先自己扔块砖头出来. 归纳如下: 故障现象 : 无法连接 ...

  9. mysql爆内存_线上MySQL数据库机器内存爆掉原因分析与解决

    本文主要向大家介绍了线上MySQL数据库机器内存爆掉原因分析与解决,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 现象: 阿里金融某业务的MySQL机器的内存每隔几天就会增长,涨 ...

最新文章

  1. SVO学习笔记(一)
  2. matlab llc谐振电路,一个菜鸟对LLC谐振知识的渴望
  3. android 中处理崩溃异常并重启程序
  4. Linux文件存储结构,包括目录项、inode、数据块
  5. excel 下拉框选择月份显示不同的日历_秒杀Excel的数据分析工具,几分钟教你完成数据填报...
  6. [运维]---linux机器一般监控用到的概念记录
  7. 7种主流案例,告诉你调度器架构设计通用法则(干货!)
  8. 刑侦高考:如何用SQL解决环环相扣的刑侦推理问题
  9. filestream_SQL Server FILESTREAM内部概述
  10. ISO50001认证辅导,ISO50001验厂优化所有流程中的能源性能,促进更高效的能源管理
  11. mysql awr报告生成_批量生成AWR报告(转载总结)
  12. DLL的远程注入技术
  13. Matlab 曲线拟合之polyfit与polyval函数
  14. 七个 ios 上的 android 模拟器
  15. 交易日节假日查询API接口规范
  16. EfficientDet实验笔记
  17. Mysql 主键 联合主键 索引 唯一索引 被抠细节问死的问题
  18. Vuex前端saas人力资源中台管理项目第四天 员工管理模块
  19. SheetJS生成/解析Excel
  20. Lua中保留两位小数

热门文章

  1. ssh服务、密钥登陆配置
  2. APScheduler —— Python化的Cron
  3. 记一个简单的保护if 的sh脚本
  4. C之printf()函数
  5. 【初级】String str= ac,42,123,sd Fa,c df,4,acdf,5ewRRre ;1.把字符串按,进行分割
  6. Kali下JDK1.8的安装过程
  7. 【数据结构与算法】之深入解析“我的日程安排表II”的求解思路与算法示例
  8. Metal之简单渲染动态切换屏幕颜色
  9. 【数据结构与算法】之线性表的应用和操作
  10. C语言设备管理器作业,你知道到吗,C语言竟是如何调用硬件的?