thinkphp做网站有什么好处,怎么做电商运营,网站编程培训机构排名前十,asp响应式h5网站源码先来一个模棱两可的说法#xff1a;因为精度丢失、存储溢出的问题 先复习一下二进制的转换方法#xff1a;
整数#xff1a;除以基数#xff0c;取余#xff0c;自底向上小数#xff1a;乘以基数#xff0c;取整#xff0c;自顶向下
接着#xff0c;复习一下双精度… 先来一个模棱两可的说法因为精度丢失、存储溢出的问题 先复习一下二进制的转换方法
整数除以基数取余自底向上小数乘以基数取整自顶向下
接着复习一下双精度浮点数double
Number 类型使用IEEE754 标准 64位 存储
符号位1位0 表示正数1 表示负数指数位11位固定值1023 指数实际值 (2 ^ (e-1)) - 1 (2 ^ (11 - 1)) - 1 1023这一步看不懂可先跳过待会解释 小数位52位
双精度浮点数即为每个数值分配 64位存储空间以科学计数法的方式存储
中间插播一个小内容怎么理解指数位
1、IEEE 754 标准中的双精度浮点数采用了带有偏移量的指数表示 2、具体来说双精度浮点数的指数部分是一个11位的二进制数其中最小值是全000000000000最大值是全111111111111。这11位的二进制数会被解释为一个无符号整数然后从中减去一个偏移值来得到最终的指数。 3、IEEE 754 双精度浮点数的指数偏移值是 2 ( k − 1 ) − 1 2^{(k-1)} - 1 2(k−1)−1其中 k 是指数部分的位数。对于双精度浮点数k 是11所以偏移值是 2 ( 11 − 1 ) − 1 1023 2^{(11-1)} - 1 1023 2(11−1)−11023。 4、例如如果指数部分的二进制表示是 01111111111那么对应的无符号整数是 2 10 − 1 1023 2^{10} - 1 1023 210−11023。然后减去偏移值 1023最终得到实际的指数值为0。 5、这个偏移量的使用允许浮点数表示非常大和非常小的数因为指数的范围可以从负数到正数。同时由于使用偏移值指数部分的二进制表示中并不包含真实的指数值而是需要通过减去偏移值来得到真实的指数。
了解上面两个知识点之后开始进入正文 第一步0.1 转换二进制为0.00011001…1001循环 第二步二进制转换为科学计数法 1.1001 * 2^ (-4) 第三步计算指数位 1023 (-4) 1019 01111111011 第四步计算小数位为1001无限循环 因此0.1 符号位0 指数位01111111011 小数位1001…
由于小数位只有52为因此第53位为1截取保存的时候进了1所以发生了精度丢失。 即后四位小数为 1001 1 1010
针对于0.2也进行同样分析相加的时候同样也出现了截取保存的情况即出现第二次精度丢失所以最终转换为10进制的时候为 0.30000000000000004
综上所述 1、由于js采用二进制处理数据用IEEE 754双精度浮点数标准来存储 Number 类型 2、精度丢失非JS问题而是IEEE 754标准存储位有限 3、过程中出现了两次精度丢失问题一次在存储一次在相加
解决方案 1、两个数分别乘以100得到结果再除以100