首页 > 其他分享 >99.为什么0.10.20.3如何解决这个问题

99.为什么0.10.20.3如何解决这个问题

时间:2023-07-14 23:24:55浏览次数:50  
标签:20.3 0.1 浮点数 0.2 99 二进制 0.10 对齐 精度

99. 为什么 0.1 + 0.2 != 0.3?如何解决这个问题?

当计算机计算 0.1+0.2 的时候,实际上计算的是这两个数字在计算机里所存储的二进制,0.1 和 0.2 在转换为二进制表示的时候会出现位数无限循环的情况。js 中是以 64 位双精度格式来存储数字的,只有 53 位的有效数字,超过这个长度的位数会被截取掉这样就造成了精度丢失的问题。这是第一个会造成精度丢失的地方。在对两个以 64 位双精度格式的数据进行计算的时候,首先会进行对阶的处理,对阶指的是将阶码对齐,也就是将小数点的位置对齐后,再进行计算,一般是小阶向大阶对齐,因此小阶的数在对齐的过程中,有效数字会向右移动,移动后超过有效位数的位会被截取掉,这是第二个可能会出现精度丢失的地方。当两个数据阶码对齐后,进行相加运算后,得到的结果可能会超过 53 位有效数字,因此超过的位数也会被截取掉,这是可能发生精度丢失的第三个地方。

对于这样的情况,我们可以将其转换为整数后再进行运算,运算后再转换为对应的小数,以这种方式来解决这个问题。

我们还可以将两个数相加的结果和右边相减,如果相减的结果小于一个极小数,那么我们就可以认定结果是相等的,这个极小数可以
使用 es6 的 Number.EPSILON

详细资料可以参考:
《十进制的 0.1 为什么不能用二进制很好的表示?》
《十进制浮点数转成二进制》
《浮点数的二进制表示》
《js 浮点数存储精度丢失原理》
《浮点数精度之谜》
《JavaScript 浮点数陷阱及解法》
《0.1+0.2 !== 0.3?》
《JavaScript 中奇特的~运算符》

标签:20.3,0.1,浮点数,0.2,99,二进制,0.10,对齐,精度
From: https://www.cnblogs.com/zhuoss/p/17555327.html

相关文章

  • P1216 [USACO1.5] [IOI1994]数字三角形
    自己的思想:要用逆序,但是某个未知的位置可能存在一个非常大的数,因此不知道如何dp看题解之后:对于倒数第二行的数,可以算出它们的最优解,依次往上推,第一个数就是整体的最优解,其实本质上可以用隔离意识来看,在搞最后一排时,将前面所有排隔离掉,在处理中间的每一排时,又将其他排隔离掉接下......
  • 99.如何在不使用额外空间的情况下,交换两个数?你有几种方法
    99.如何在不使用额外空间的情况下,交换两个数?你有几种方法1)算术x=x+y;y=x-y;x=x-y;2)异或x=x^y;//只能对int,char..y=x^y;x=x^y;x^=y^=x;参考资料来源:阿秀......
  • P3599题解
    本题是一道比较典的构造题,拿来扩宽扩宽大家的眼界吧。Task1试判断能否构造并构造一个长度为\(n\)的\(1\simn\)的排列,满足其\(n\)个前缀和在模\(n\)的意义下互不相同。很容易想到的一点是:\(n\)一定排在第一位,因为如果排在别的位,加上\(n\)后在模\(n\)意义下是不......
  • Rockchip RK3399 - DAPM
    DAPM是DynamicAudioPowerManagement的缩写,即动态音频电源管理,旨在允许便携式Linux设备在任何时候使用音频子系统中的最小电量。它独立于其他内核PowerManager,故可以很容易地与其他PM系统共存。DAPM对所有用户空间应用程序来说也是完全透明的,因为所有电源切换都是在ASoC核心内......
  • CodeForces 997C Sky Full of Stars
    洛谷传送门CF传送门考虑容斥,钦定\(i\)行\(j\)列放同一种颜色,其余任意。\(i=0\)或\(j=0\)的情况平凡,下面只考虑\(i,j\ne0\)的情况。答案为:\[\sum\limits_{i=1}^n\sum\limits_{j=1}^n(-1)^{i+j+1}\binom{n}{i}\binom{n}{j}3^{(n-i)(n-j)+1}......
  • gym 102994M Travel Dream 题解
    给定带权无向图,求最大\(k\)元环。\(n,m\leq300,3\leqk\leq10\),无重边。把\(k=3\)判掉,可以\(O(m^2)\)轻松解决。把\(k\)元环拆成长度为\(\dfrac{k}{2}-1\)的链\(+\)长度\(k-\dfrac{k}{2}-1\)的链\(+\)连接两条链的两条边。(长度指边的个数)问题:两条链需要无......
  • Rockchip RK3399 - Machine驱动
    Machinedriver描述了如何控制platform、codec、cpudai(DigitalAudioInterface,数字音频接口)和codecdai,使得互相配合在一起工作,Machine驱动代码位于sound/soc/generic/simple-card.c文件。一、设备节点1.1设备节点rt5651-sound我们在arch/arm64/boot/dts/rockchip/rk3399-ev......
  • Rockchip RK3399 - Codec驱动基础
    在上一篇博客我们介绍了ALSA子系统的软件架构,同时介绍了ALSACORE核心数据结构和相关API。本节我们将会介绍ASoC软件体系中音频三大驱动模块:Codec、Platform和Machine。一、ASoC核心数据结构我们首先来了解Codec、Platform和Machine驱动中涉及到的数据结构,知道每个数据结构以......
  • Rockchip RK3399 - Platform驱动
    Platfromdriver提供了配置/使能SoC音频接口的能力;Plaftrom驱动分为两个部分:snd_soc_platform_driver、snd_soc_dai_driver。snd_soc_platform_driver:负责管理音频数据,把音频数据通过DMA或其他操作传送至CPUDAI中;snd_soc_dai_driver:负责完成SoC一侧的DAI参数配置,同时也会通过......
  • Rockchip RK3399 - Codec驱动( Realtek ALC5651)
    Codecdriver提供了配置/使能Codec的能力,驱动代码位于sound/soc/codecs/rt5651.c文件。一、设备节点1.1设备节点rt5651我们在arch/arm64/boot/dts/rockchip/rk3399-evb.dts文件添加rt5651设备节点,该节点位于i2c1节点下:&i2c1{status="okay";i2c-scl-rising-time......