一、场景描述
发现js把response中的数据转成json格式之后,值不一样了。
原因:在js中Number类型统一按浮点类型处理,大整数的精度丢失和浮点数本质上是一样的,尾数位最大是 52 位,因此 JS 中能精准表示的最大整数是 Math.pow(2, 53),十进制即 9007199254740992,大于 9007199254740992 的可能会丢失精度。
解决:后台把Long转成string在返回给前段。
二、浮点数简介
对于浮点类型的数据采用单精度类型(float)和双精度类型(double),按照浮点数存储标准(IEEE 制定)来存储,float数据占用32bit,double数据占用64bit。
单精度的存储方式如下图所示:
双精度的存储方式如下图所示:
三、浮点数转二进制
例如:9.2转二进制
整数部分:9 ==> 1001
小数部分转二进制:小数乘以2,取整,小数部分继续乘以2,取整,得到小数部分0为止,将整数顺序排列.
比如0.2
0.2 * 2 = 0.4,取整0,小数部分0.4
0.4 * 2 = 0.8,取整0,小数部分0.8
0.8 * 2 = 1.6,取整1,小数部分0.6
0.6 * 2 = 1.2,取整1,小数部分0.2
….无限循环
即为0011*N
四、浮点数的二进制存储
- 符号位:0表示正数,1表示负数.
- 对于指数部分N,因为指数可正可负,8位的指数位能表示的指数范围就应该为:-127~128,所以可以对他进行置偏,根据浮点数的存储标注(IEEE),float 类型的指数起始数为127(二进制0111 1111),double类型的指数起始数为1023(二进制011 1111 1111),在此基础上加指数,得到的就是内存中的指数的表示形式.所以指数部分的存储采用移位存储,存储的数据为32位则元数据+127 ,64位则+1023
- 尾数则直接填入,位数不够则补0,位数过多则0舍1入
举个栗子:9.125
整数部分:9.125==>9==>1001
小数部分:
0.125 * 2 = 0.25 ==> 取整0,余数0.25 ==>0
0.25 * 2 = 0.5 ==> 取整0,余数0.5 ==>0
0.5*2 = 1.0 ==> 取整1 ==>1
拼接后9.125 ==> 1001.001==> 1.001001*2^3
1.001001 * 2^3 ==>
0 127 +3 0010 01 ==>
0 1000 0010 0010 01 ==> 0100 0001 0001 0010 0000000000000000
五、浮点数精度丢失
2.2转换成二进制为0 0111 1110 00110011001100110011 ….无穷,但是因为 float 和 double 存储的位数都有限,那么超出位数部分的肯定就被截断了。
这就导致2.2最终被保留下来的可能就是:
0 (1位符号位) 0111 1110(8位指数位) 00110011001100110011…(23位位数)
相关推荐
12. 数据库相关描述:外关键字是另一个关系的关键字,但在这个关系中不是主键。 13. 打开报表的宏命令:在Access中,使用`OpenReport`命令可以打开报表。 14. MySQL游标:游标可以在存储过程、存储函数和触发器中...
- **详细解释**:在JavaScript中,可以使用`Math.max()`函数来获取两个或多个数字中的最大值。因此,正确答案是选项A——`Math.max(2,4)`。 ### 27. 最小事件集的组成部分 - **知识点概述**:在编程中,某些事件是...
- **详细解析**:在JavaScript中,`Math.max()` 函数用于获取一组数值中的最大值。该函数接受任意数量的参数,并返回其中的最大值。例如,在本题中,`Math.max(2, 4)` 将返回4,因为4是2和4中的较大值。 - **相关...
`会丢失精度,因为int参与运算;`s1 += 1`则会自动转换并保留原始类型。 7. Char能存储一个汉字是因为它占用16位,可以表示Unicode编码中的所有字符。 三、其他部分: 这部分涵盖Java的高级概念,包括多线程、异常...
python学习资源
jfinal-undertow 用于开发、部署由 jfinal 开发的 web 项目
基于Andorid的音乐播放器项目设计(国外开源)实现源码,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。
python学习资源
python学习资源
python学习一些项目和资源
【毕业设计】java-springboot+vue家具销售平台实现源码(完整前后端+mysql+说明文档+LunW).zip
HTML+CSS+JavaScarip开发的前端网页源代码
python学习资源
【毕业设计】java-springboot-vue健身房信息管理系统源码(完整前后端+mysql+说明文档+LunW).zip
成绩管理系统C/Go。大学生期末小作业,指针实现,C语言版本(ANSI C)和Go语言版本
1_基于大数据的智能菜品个性化推荐与点餐系统的设计与实现.docx
【毕业设计】java-springboot-vue交流互动平台实现源码(完整前后端+mysql+说明文档+LunW).zip
内容概要:本文主要探讨了在高并发情况下如何设计并优化火车票秒杀系统,确保系统的高性能与稳定性。通过对比分析三种库存管理模式(下单减库存、支付减库存、预扣库存),强调了预扣库存结合本地缓存及远程Redis统一库存的优势,同时介绍了如何利用Nginx的加权轮询策略、MQ消息队列异步处理等方式降低系统压力,保障交易完整性和数据一致性,防止超卖现象。 适用人群:具有一定互联网应用开发经验的研发人员和技术管理人员。 使用场景及目标:适用于电商、票务等行业需要处理大量瞬时并发请求的业务场景。其目标在于通过合理的架构规划,实现在高峰期保持平台的稳定运行,保证用户体验的同时最大化销售额。 其他说明:文中提及的技术细节如Epoll I/O多路复用模型以及分布式系统中的容错措施等内容,对于深入理解大规模并发系统的构建有着重要指导意义。
基于 OpenCV 和 PyTorch 的深度车牌识别
【毕业设计-java】springboot-vue教学资料管理系统实现源码(完整前后端+mysql+说明文档+LunW).zip