美文网首页
js浮点型精度

js浮点型精度

作者: 做我想做与写我想写 | 来源:发表于2019-01-07 13:45 被阅读0次

相信大家都碰到过这样一个问题,在js中为什么 0.1 + 0.2 == 0.3 结果是false,答案显而易见0.1+0.2的答案是0.30000000000000004,而0.15 + 0.25 == 0.4 却是true,当初百思不得其解,那为什么0.15 + 0.25 的答案却不会用17位的精度显示呢,所以一直在思考这个问题,买来的一些js书籍是这么描述的,"js的精度并不适用于特定的浮点数值",这就有些晦涩难懂了,然后就会陷入一个关于特定于非特定的怪圈.

这个问题应该从根源去解决,我们都知道,js的Number类型包含了整数值和浮点型,但是浮点型的占用内存却是整数值的俩倍,所以js处理浮点型的数值时会先对其进行取整处理,如果可以转换,那么就会作为整数来处理(例如:1.0 其实真正使用的是1 例如 .1 也是使用的1 因为js会自动过滤掉小数点后的第一位0值 如这样 1.01 那么就会作为真浮点型1.01来使用),js的整数仅仅是双精度浮点数的一个子集,不是单独的一个类型

回到刚才那个问题,这个问题首先要从数位表示法说起。今天我们看到的123这样的十进制数,是自然而然的理解其意义,但是有没有深究其内在的数学原理呢?

所谓十进制是0~9十个基本符号为基础的一种数字表示法,数位表示法是将一串基本符号从左到右连续排列的一种方法。为什么12时表示一十二,而不是二十一,或者是一加二的意思呢?因为数字所处的位置是有特别意义的,最右边第一个数字符号,代表基本的数0~9,而第二位的意义并不是0~9,而是0*10~9*10。推而广之,百位是x*100,(x是符号),用简练的数学公式就是x*10^k , 个位k是0,十位是1,百位k是2,从右到左一直数下去。123的意思就是1*10^2+2*10^1+3*10^0。

总结算术运算的过程就是,将操作数转换为整数,然后使用整数位模式进行运算,最后将结果转换为标准的js浮点数。

那么测试一下吧,(如下图所示,ps:不知道怎么排一行诶)

通过转换成分数再转换成32位浮点位可以看出其实得到的位数据(小数点后面的32位)转换成"整数",但真实的结果却是经过四舍五入得到的,尽管64位浮点数精度已经很高,但双精度浮点数也只能表示一组有限的数字,而不能表示所有的实数集。浮点运算只能产生近似的结果,四舍五入到最接近的可表示的实数。当你执行一系列的运算,随着舍入误差的积累,运算结果会越来越不精确。

但是对于之前0.15 + 0.25 以及上图这个0.28 + 0.23 却能正确表示,我的理解是当参与运算的浮点型数据精度高了,那么运算的结果可能会更加精确些吧.但是依旧无法保证其预算的精确度,故而在运算浮点型数据时可以转换成整数再换算成浮点型,避免js的内核通过位运算去"四舍五入",如下

有时候可以使用分数去判断(位判断还是云里雾里的赶脚),例如 3/10 != 0.3 ;但是 15/100 + 25/100 == 4/10 ,故而为真.

那么第一个博客就这么愉快的结束了,行动才是检验真理的唯一标准,可能我这个理解也是歪的,加油努力试着去理解一些更底层的东西吧,如果发现这个错了就跑回来改了吧.

                                                                                                                                                                                知错能改,用行动检验"真理"哈!

相关文章

  • js浮点型精度

    相信大家都碰到过这样一个问题,在js中为什么 0.1 + 0.2 == 0.3 结果是false,答案显而易见0....

  • 关于浮点型精度问题的一些理解

    这是一篇关于浮点型精度的文章,大致会从三个大的问题入手,去解析精度问题。 字符串转浮点型出现精度丢失 浮点型和浮点...

  • js 浮点型精度计算

    //加法函数,用来得到精确的加法结果 //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比...

  • 雷潮教育第一期班C#课程阶段总结(1)

    1.基本数据类型 数值类型整型 int单精度浮点型 float双精度浮点型 double更高精度数值(财务) de...

  • JAVA/JS 精度丢失问题

    在JAVA和JS浮点型数值直接计算中,经常会出现一些精度丢失的情况。 JAVA和JS采用的是IEEE 754规范,...

  • JS浮点型的运算精度问题

    精度问题 大家一定遇到过这种问题: 这真是一个令人黯然蛋碎的bug,而且即使在es6时代依然没能解决,怎么办呢?只...

  • 1.3 Float 浮点型

    浮点型,也叫浮点数float、双精度数double或实数real。 浮点数在精度上会存在一些误差,所以永远不要相信...

  • Cousera 计算导论与C语言基础 学习笔记

    C语言中的数据成分 第一课 1、整数型的类别 1)sizeof运算符 2、浮点型 1)浮点型的精度 2)浮点型的存...

  • Go语言入门总结(二)- 基本类型

    类型 1.实数 浮点型声明方式有三种 默认情况下go声明浮点型变量都是float64双精度浮点型,比float32...

  • C语言学习 - 浮点型数据类型

    在 C语言中,浮点型数据类型可分为:float(单精度)、double(双精度)、long double(长双精度...

网友评论

      本文标题:js浮点型精度

      本文链接:https://www.haomeiwen.com/subject/vmwyrqtx.html