都工作两年了,还不知道浮点数如何转二进制?
来吧,坐下聊
先前在前文 《老大说:谁要再用double定义商品金额,就自己收拾东西走》 中就已经痛彻心扉地聊过:
在处理诸如 订单交易、货币计算、以及商品金额慎用浮点数(
double
/float
)去定义变量,否则可能会遇到各种奇葩的问题,具体示例在那篇文章中都详细展示过。
当时写那篇文章的时候,我以为大家对于小数转二进制的换算早已了然于胸,所以也就没有给出具体的换算过程。结果文章发出来后,私信里一票小伙伴反馈说,文中那些小数转二进制的例子到底是怎么换算出来的,最好详解一下。
得嘞,这不就来了嘛!
顺带聊一句,看来《计组原理》或者说《计算机系统》这门课有必要小规模回炉重造一下了(滑稽)。
不过实不相瞒,CRUD、复制粘贴、调接口、写业务代码久了,计算机基础确实好多都忘了…我也有深有同感!
浮点数在计算机中是如何表示的?
学过 《计算机组成原理》 或者类似 《计算机系统》 这些课程的小伙伴们应该都知道,浮点数在计算机中的存储方式遵循IEEE 754 浮点数计数标准,可以表示为:
采用尾数 + 阶码的编码方式,更通俗一点说,就是类似于数学课本上所学的科学计数法表示方式:有效数字 + 指数位!
因此,只要给出:符号(S)、阶码部分(E)、尾数部分(M) 这三个维度的信息,一个浮点数的表示就完全确定下来了,所以float
和double
这两种类型的浮点数在计算机中的存储结构就表示成下图所示这个样子:
1、符号部分(S)
0
-正 1
-负
2、阶码部分(E)(指数部分):
- 对于
float
型浮点数,指数部分8
位,考虑可正可负,因此可以表示的指数范围为-127 ~ 128
- 对于
double
型浮点数,指数部分11
位,考虑可正可负,因此可以表示的指数范围为-1023 ~ 1024
3、尾数部分(M):
浮点数的精度是由尾数的位数来决定的:
- 对于
float
型浮点数,尾数部分23
位,换算成十进制就是2^23=8388608
,所以十进制精度只有6 ~ 7
位; - 对于
double
型浮点数,尾数部分52
位,换算成十进制就是2^52 = 4503599627370496
,所以十进制精度只有15 ~ 16
位
所以,浮点数交给计算机存储的时候,可能会有精度丢失问题!!!因此使用时需要格外小心,如果真因为这一块出了bug,定位问题还是非常艰难的,所以预防工作要做好。
进制转换计算案例
上面说的是IEEE标准规定的内容,属于理论规约。那一个小数到底要怎么换算成二进制呢?我们得拿实际例子来解释。
先来个简单的例子
比如:把十进制小数0.875
转换成二进制,具体怎么操作?
可以分几大步走:
1、以小数点为界,拆分
2、整数部分转换
整数转二进制我想大家应该都熟悉,使用:除2取余法 即可。而这里的0.875
整数部分为0,无需操作。
3、小数部分转换
小数部分的转换不同于整数部分,采用的是 “乘2取整法” ,图示一下就明白了:
4、合并结果
整数部分 + 小数部分
,最终得到二进制结果为0.111
。
所以该结果按照上一节所述的尾数 + 阶码的计算机计数方式,则可以表示为:
所以对应可得:
- 符号位:
0
- 阶码(E)部分:若以
float
为例,应为127 +(-1)= 126
,因此二进制表示为:01111110
- 尾数部分(M):若以
float
为例,应为23
位,因此尾部补齐后为11000000000000000000000
。
因此最终的总结果为(以32
位精度float
表示):
00111111011000000000000000000000
再来个复杂点例子
再比如:把十进制小数6.36
转换成二进制,具体怎么操作?
但凡能用图示,我就不想写文字,所以用一张图就可以解释得明明白白:
整数部分 + 小数部分,因此最终得到的结果二进制结果为110.01011100...
。
还是按照上一节所述的尾数 + 阶码的计算机计数方式,则可以表示为:
所以对应可得:
- 符号位:0
- 阶码(E)部分:若以
float
为例,应为127 +(2)= 129
,因此二进制表示为:10000001
- 尾数部分(M):
1001011100...
,其实它本身无限不循环,但若以float
型精度来截取23
位,则可以表示为10010111000010100011111
因此最终的总结果为(以32
位精度float
表示):
01000000110010111000010100011111
所以像这种无限位数的尾数情况,用计算机存储产生截取是必然的,必定会有一定的精度损失!所以这也从根本上解释了为什么float或者double这种类型数据使用时的风险性,因此必须要结合实际业务理性考量。
神器加持
大家如果对上面的计算结果不放心,或者想检查手动换算的结果是否正确,也有直接的这种二进制转换工具站,典型的比如binaryconvert
不想手动换算的,直接去上面输入,转换一下即可得到结果,而且可以进制互换,使用非常方便。
回味
有时候回顾一下基础真的蛮有意思的,比如写这篇文章时,虽然是很基础的东西,但是表达出来的过程还是挺有趣的,尤其是画图展现的过程,希望能和小伙伴们共勉。
都工作两年了,还不知道浮点数如何转二进制?相关推荐
- java浮点数数转二进制的数吗_都工作两年了,还不知道浮点数如何转二进制?...
来吧,坐下聊 先前在前文 <老大说:谁要再用double定义商品金额,就自己收拾东西走> 中就已经痛彻心扉地聊过: 在处理诸如 订单交易.货币计算.以及商品金额慎用浮点数(double/f ...
- java 对word加密_Word文档中怎样给文件信息加密?大神都这样操作,你还不知道?...
对于Word的使用相信大家都不陌生,在工作中使用Word是很常见的操作,但是很多朋友不知知道一些基础的操作,对于再深奥的点的技能不知道怎样使用,今天小编为大家总结了几个简单的Word操作技巧,希望可以 ...
- 都2019年了,还不知道产品设计师是什么?
介绍产品设计师是什么,与普通UI的区别,以及如何晋升. 前段时间有朋友来询问,产品设计师是一个什么样的岗位,要负责哪些工作? 我其实是比较奇怪的,这个概念已经兴起了一两年了,从阿里的全链路设计师到产品 ...
- 苹果怎么换行打字_微信悄悄上线新功能!安卓苹果都有,很多人还不知道……...
微信更新啦! 这次更新的内容不多,但胜在实用! 赶紧来看看! 接龙表格功能上线 最近突然流行起在群里发团购邀请虽然有的时候是真的能薅到羊毛但是这样复制粘贴排队接的信息不仅刷屏,而且很容易"撞 ...
- 2017都要过去了,还不知道服务设计?
@尤原庆 :初学服务设计,读了一本好书,推荐并笔记.:) 书名:This is Service Design Thinking: Basics, Tools, Cases 作者:Marc Stickd ...
- 面试官问你 SpringMVC 的工作原理,你还不知道吗?
SpringMVC的工作原理图: SpringMVC流程 1. 用户发送请求至前端控制器DispatcherServlet. 2. DispatcherServlet收到请求调用HandlerMapp ...
- 都2021年了,还不知道什么是区块链就out了 | 从区块链数据结构到应用
序言 在现阶段及后10年都是发展主流的数字化经济的催动下,区块链技术越来越火爆.那么比特币的区块数据结构是如何构成的,区块链有什么特性,我们用区块链能用来做什么?我们一起来探讨下. 区块链诞生背景 2 ...
- Thread.start() ,工作这么久,还不知道它是怎么让线程跑起来的!
作者:小傅哥 博客:https://bugstack.cn Github:https://github.com/fuzhengwei/CodeGuide/wiki 沉淀.分享.成长,让自己和他人都能有 ...
- 工作这么多年还不知道如何对MySQL进行性能压测?这也太Low了吧
大家好,我是冰河~~ 今天给大家带来一篇关于MySQL的技术文,这也是我对MySQL使用UUID做主键与int数字做主键做的性能压测. 之前,总有小伙伴问我:为何使用UUID做MySQL的主键,MyS ...
最新文章
- 基因疾病关联的图卷积神经网络
- 机器学习 —— 基础整理(三)生成式模型的非参数方法: Parzen窗估计、k近邻估计;k近邻分类器...
- 安装教程_Typora+Pandoc导出word
- Spring Shiro 入门必看
- hdu 2160 母猪的故事(睡前随机水一发)(斐波那契数列)
- [css] 请写出:link、:visited、:hover、:active的执行顺序
- python coding style why_Python 编码规范(Style Guide)2
- 图片传输_一幅图片的奇妙旅行,网络传输分层通信协议原理揭秘
- 宜普电源转换公司(EPC)于2018年WiPDA宽能隙功率器件及应用论坛与工程师作技术交流
- 速达软件登录远程客户端总提示检查卡号密码
- 成都理工大学计算机考研资料汇总
- 最小采样频率计算公式_音频文件大小计算公式-好文转载
- 一款好用的bi报表软件,让你站在Excel的肩膀上
- 3dMax 制作玻璃材质
- 噬菌体疗法减缓细菌耐药性进化
- 计算机考试320034,联想一体机可以用作显示器吗?
- K8S系列:pod更新镜像方法、原理
- 在手机触摸屏领域应用的触摸芯片
- Gallery3d 学习笔记(13)
- APM一些疑难故障的处理
热门文章
- (二)nvidia jetson orin nvcsi tegra-capture-vi camera相关内容梳理 之 nvcsi,v4l2相关代码分析
- cdrx7拼版工具在哪里_CorelDRAW X7中调和工具的运用
- java 获取本机连接过的所有WiFI密码
- 7280-77-5,Cyclo(Leu-Phe),Cyclo-(L)-phenylalanyl-(L)-leucyl
- JavaScript作用域和作用域链详解
- 飞越680pro+pixhack装机有感
- z370-A装机记录
- DAI(dynamic arp inspection)
- python贷款还款预测
- python3 爬虫相关学习10:RE 库/ regex /regular experssion正则表达式学习