bigdecimal 保留两位小数_一起聊聊小数的储存和运算

原创: 蜀中亮子 玄说前端


小数运算的问题
在 js 中的小数运算中,一直存在着一个问题,
比如:0.1+0.2=0.30000000000000004 、0.4-0.3=0.10000000000000003。
那么为什么会出现这种情况呢?这种情况又如何解决呢?
为什么?
这就要讲到 js 小数的存储,在 js 找那个所有的数字包括小数和整数都只有一种类型—Number。它实现遵循 IEEE 754 标准。使用 64 位固定长度来表示。
这样的存储结构优点是可以归一化处理整数和小数,节省存储空间。
64 位比特又可分为三个部分:

  • 符号位 S:第 1 位是正负数符号位(sign),0 代表正数,1 代表负数
  • 指数位 E:中间的 11 位存储指数(exponent),用来表示次方数
  • 尾数位 M:最后的 52 位是尾数(mantissa),超出的部分自动进一舍零

5a13456f84c00902dbec2414d82af81d.png


实际数字就可以用以下公式来计算:

e66090386158043728a594287cfdb29b.png


注意以上的公式遵循科学计数法的规范,在十进制是为 0<M<10,到二进制就是 0<M<2。也就是说整数部分只能是 1,所以可以被舍去,只保留后面的小数部分(想不通这个道理的,可以看下下面0.1的例子)。
比如:十进制 4.5 转换成二进制就是 100.1,科学计数法表示是 1.001*2^2,舍去 1 后 M = 001;
E 是一个无符号整数,因为长度是 11 位,取值范围是 0~2047。但是科学计数法中的指数是可以为负数的,所以再减去一个中间数 1023,[0,1022]表示为负,[1024,2047] 表示为正。如 4.5 的指数 E = 1025,尾数 M 为 001。
最终的公式变成:

f66997859f5da3a46543b49171c040c8.png


所以 4.5 最终表示为(S=1、E=1025、M=001);
再以 0.1 例解释浮点误差的原因, 0.1 转成二进制表示为 0.0001100110011001100(1100 循环),1.100110011001100x2^-4,所以 E=-4+1023=1019;M 舍去首位的 1,得到 100110011...。转化成十进制后为 0.100000000000000005551115123126,因此就出现了浮点误差。
那小数是怎么转为二进制的呢?
小数转二进制
比如数字 3.2 转为二进制的过程;

  • 第一步:0.32*2=0.64,这个时候整数部分是 0,所以第一位是 0,那么就是 0.0
  • 第二步:0.64*2=1.28,这个时候整数部分是 1,所以第二位是 1,那么就是 0.01
  • 第三步:把取了一之后的 1.28 减去 1 之后转换为 0.28,拿这个部分再乘以二,那么就是 0.28*2=0.56,这个时候整数部分是 0,所以第三位是 0,那么就成了 0.010
  • 第四步:0.56*2=1.12,这个时候整数部分是 1,所以第四位是 1,那么就是 0.0101,
  • 第五步:和第三步的思路一样 这样一直到最后小数部分没有了的时候,就算是转换完成。为什么要乘以二,因为使用二进制数据表示数的时候,只有两位,0 和 1。

怎么解决这个问题
第一种
把小数转成整数后再运算。以加法为例:
0.1+0.2
把数字都乘以他们可以转换为整数的倍数,计算之后,再除以乘上的倍数。比如:(0.1*10+0.2*10)/10
第二种
还有另一个方案,是做一个自己的计算过程,比如 0.1+0.2,首先通过正则或者 AST 或者其他的解析方式,匹配出了符号和数字,再把字符按照四则运算法的规律来计算,0.1 和 0.2 取小数位后第一位相加减,是否进 1,发现不需要去整数位第一位加减,依次递推。这个方法的思路就和我们竖式计算一样,把竖式计算的思路,代码化。至此,小数的计算与原因都找到了。拓展一下,在计算机底层 cpu 是怎么进行加减乘除运算的呢?可以进群讨论最后附上想进前端群的可以加微信,备注:玄说前端。

aac3e9cd990060fcb493726f21add00f.png

END
获得更多信息关注公众号

6eb7a01881d8c6eed676c5b56cd5a4f1.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/476846.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从DeepFace到AdaFace,7篇论文讲清人脸识别

人脸识别是现在应用最广泛的视觉技术之一&#xff0c;同时也是前沿研究热点之一。我找来了深耕人脸的朋友张老师&#xff0c;从DeepFace到AdaFace&#xff0c;讲解deepface、facenet、vggface、sphereface、cosface、adaface等论文&#xff0c;给各位做一次人脸识别的系统分享。…

提升方法(Boosting)

文章目录1. 提升方法AdaBoost算法2. AdaBoost算法训练误差分析3. AdaBoost算法的解释4. 提升树5. sklearn 实例提升&#xff08;boosting&#xff09;方法是一种常用的统计学习方法&#xff0c;应用广泛且有效。 在分类问题中&#xff0c;它通过改变训练样本的权重&#xff0c…

在两个页面之间传递信息

在asp.net不同页面之间传值的方法主要有三种:(1)用querystring方法&#xff1a;在vs2005中新建asp.net网站(发送端)&#xff0c;在页面上添加button,两个TextBox,代码如下&#xff1a;protectedvoidButton1_Click(objectsender, EventArgs e) { string url; u…

英特尔或将大幅裁员

编辑 | David来源 | 新智元受PC业务持续不振影响&#xff0c;曝英特尔计划裁员数千人&#xff0c;可能将影响20%的员工。据知情人士透露&#xff0c;英特尔公司正计划大幅裁员&#xff0c;人数可能达到数千人&#xff0c;以削减成本&#xff0c;应对不景气的个人电脑市场的萎缩…

pandas object转float_25个Pandas实用技巧

本文一共为大家分享25个pandas技巧&#xff0c;此为上篇~显示已安装的版本输入下面的命令查询pandas版本&#xff1a;In [7]:pd.__version__Out[7]:0.24.2如果你还想知道pandas所依赖的模块的版本&#xff0c;你可以使用show_versions()函数:In [9]&#xff1a;pd.show_version…

LeetCode 820. 单词的压缩编码(后缀树)

文章目录1. 题目2. 解题2.1 反转字符串字符查找2.2 后缀树1. 题目 给定一个单词列表&#xff0c;我们将这个列表编码成一个索引字符串 S 与一个索引列表 A。 例如&#xff0c;如果这个列表是 ["time", "me", "bell"]&#xff0c;我们就可以将其…

sql查询分页

用sql 查询时select top 10 * from Orders order by orderid desc操作时&#xff0c;我们先对查询结果进行ordersby排序 然后才取出其最前边10个使用sql查询分页时的几点思路&#xff08;举例均从查询第100到120之间20条记录&#xff09;1.取前120条记录orderby主键&#xff0c…

openstack实例状态错误_Openstack虚机操作总结

1. 概览Openstack作为常见的IAAS服务&#xff0c;其最核心的对象就是虚机实例&#xff0c;而Openstack下支持的虚机操作有很多种&#xff0c;有些是特别常见的虚机操作比如创建虚机、启动虚机、删除虚机等&#xff0c;而有些虚机操作则是针对特定场景下比如出现故障而提供的保护…

神网站PaperWithoutCode:举报无法复现的论文,让一作社死??

文 | 小戏几乎是可以肉眼可见的看到机器学习领域的论文几何级的增长&#xff0c;在铺天盖地的论文雪花纸片般涌来时&#xff0c;灌水、可复现性、工作真实的意义这些概念也伴随着 Paper 的洪水进入了人们的视野。谈及科研&#xff0c;我们总是站在以往研究的基础上&#xff0c;…

仿WINDWS无限级Ajax菜单树升级1.3版(修补了严重BUG)

仿WINDWS无限级Ajax菜单树升级1.3版(修补了严重BUG) WINDWS无限级Ajax菜单树又升级了(1.3版) 对以下BUG进行了修复 1.只能在文字上拖拽(不能从文件夹图标上拖) 2.拖拽后不刷新菜单的BUG&#xff08;拖拽为子级菜单后&#xff0c;菜单原地不消失的情况。也…

程序员面试金典 - 面试题 08.11. 硬币(背包DP)

文章目录1. 题目2. 解题1. 题目 硬币。给定数量不限的硬币&#xff0c;币值为25分、10分、5分和1分&#xff0c;编写代码计算 n 分有几种表示法。(结果可能会很大&#xff0c;你需要将结果模上1000000007) 示例1:输入: n 5输出&#xff1a;2解释: 有两种方式可以凑成总金额:…

ab的plc跟西门子哪个好些_2020滚筒洗衣机哪个牌子好?想买滚筒洗衣机的看过来!...

滚筒洗衣机哪个牌子好&#xff1f;想买滚筒洗衣机的人越来越多&#xff0c;滚筒洗衣机无疑是现在大多数年轻人更喜欢的款式&#xff0c;颜值高、功能多、追求个性化洗衣操作&#xff0c;滚筒的不伤衣物更温柔对于有真丝雪纺面料衣物的&#xff0c;滚筒洗衣机现在真是越来越智能…

AI开始参与政治选举了??

编 | David 好困源 | 新智元让AI去参加议会选举&#xff0c;能成吗&#xff1f;一个丹麦政党让AI聊天机器人当了领袖&#xff0c;试图在议会中拿下一席&#xff0c;现距离20000个提名的门槛线仅差19988个了。现在的AI能干的事情太多了&#xff0c;写作文、画画、下棋、玩游戏&a…

Linux NAT设定

1&#xff1a;echo "1" >/proc/sys/net/ipv4/ip_forward 或vi /proc/sys/net/ipv4/ip_forward把0改为1&#xff0c;0表示IP FORWARDING功能是关闭&#xff0c;1表示开启。2&#xff1a;iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0/24 -j MASQUERADE &a…

程序员面试金典 - 面试题 16.02. 单词频率(哈希表/Trie树)

文章目录1. 题目2. 解题2.1 哈希解法2.2 Trie树1. 题目 设计一个方法&#xff0c;找出任意指定单词在一本书中的出现频率。 你的实现应该支持如下操作&#xff1a; WordsFrequency(book)构造函数&#xff0c;参数为字符串数组构成的一本书get(word)查询指定单词在数中出现的…

加州大学博士生Wendy:谈论文精读与方法创新

最近刷朋友圈&#xff0c;很多童鞋的状态都是&#xff0c;不是在搞科研&#xff0c;就是在搞科研的路上&#xff0c;每日为了科研废寝忘食……每天的生活日常&#xff0c;除了下文献、读文献&#xff0c;就是做实验、写论文&#xff0c;debug&#xff0c;二十多岁的自己看着像三…

小米10pro第二个摄像头下面_小米10至尊纪念版、小米10 Pro对比评测:至尊版“至尊”在哪里?...

在几天前的雷军十周年演讲中&#xff0c;小米10至尊纪念版正式面世&#xff0c;价格刚公布&#xff0c;就引起了不小轰动。在吃瓜群众看来&#xff0c;小米终于迈向了高端&#xff0c;毕竟最贵的版本&#xff0c;售价可以卖到6999元&#xff0c;和三星、苹果旗舰保持在一个水准…

转:程序员每天该做的事

程序员每天该做的事 1、总结自己一天任务的完成情况 最好的方式是写工作日志&#xff0c;把自己今天完成了什么事情&#xff0c;遇见了什么问题都记录下来&#xff0c;日后翻看好处多多 >> 好记性不如烂笔头。呵呵 2、考虑自己明天应该做的主要工作 把明天要做的事情…

MiOJ 3. 大数相减(字符串减法)

1. 题目 描述 两个长度超出常规整形变量上限的大数相减&#xff0c;请避免使用各语言内置大数处理库&#xff0c;如 Java.math.BigInteger 等。 输入 有 N 行测试数据&#xff0c;每一行有两个代表整数的字符串 a 和 b&#xff0c;长度超过百位。规定 a>b&#xff0c;a, …

Saleforce发布跨模态框架LAVIS,涵盖数据、任务、模型

作者 | HJZ来源 | 机器之心Salesforce 亚洲研究院推出了一站式视觉语言开源框架 LAVIS。视觉语言模型在内容推荐、电子商务里有广泛应用&#xff0c;例如图像描述生成、文本图像检索以及多模态内容分类。依托于海量互联网数据&#xff0c;多模型模型近期得到长足发展&#xff0…