专栏首页娱乐心理测试关于JS的浮点数计算精度问题解决方案

关于JS的浮点数计算精度问题解决方案

由于接触JS不久,关于JS的浮点数的计算更是之前没有用过,这次写JS项目发现的这个问题:0.1+0.2=0.3000000000004,为什么会出现这么奇怪的问题呢 ?在网上找了一些资料,JS作为解释性语言,直接计算会有浮点数精度丢失问题。 门弱类型语言的JavaScript ,从设计思想上就没有对浮点数有个严格的数据类型。

解决方案: 一. 有种最简单的解决方案,就是给出明确的精度要求,在返回值的过程中,计算机会自动四舍五入,比如:

var numA = 0.1; 
var numB = 0.2; 
alert( parseFloat((numA + numB).toFixed(2)) === 0.3 );

用这种方法在测试过程中也有问题,例如6.8-0.4打印为6.3,本应为6.4所以这里转换结果还是不正确。 在浮点数计算的时候,很多时候产生的都是这种极限数据,如果要精确进行整数转换,要放大的倍数过大。这里我们可以用四舍五入对转换的过程进行优化:

Math.round((6.8-0.9)*10);//四舍五入
59

优化之后的自定义函数:

Math.formatFloat = function(f, digit) { 
    var m = Math.pow(10, digit); 
    return parseInt(f * m, 10) / m; 
} 
var A = 0.1; 
var B = 0.2;
console.log(Math.formatFloat(A + B, 1) === 0.3);

因此,为了避免产生精度差异,我们要把需要计算的数字乘以 10 的 n 次幂,换算成计算机能够精确识别的整数,然后再除以 10 的 n 次幂,大部分编程语言都是这样处理精度差异的,我们就借用过来处理一下 JS 中的浮点数精度误差。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 你知道这个小技巧吗?

    honey缘木鱼
  • 在vue中的html标签{{}}内可以调用函数方法

    今天领导提个需求,要求在金额上强制保留两位小数,本想着后台直接返回数据时,带着两位的小数,前端只是做个显示作用,后台说保留了小数但在传输过程中去掉了,可能他们做...

    honey缘木鱼
  • 微信小程序中如何打开另一个小程序

    honey缘木鱼
  • canvas绘制切片并导出图片

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    lzugis
  • 各种流行的编程风格 你属于哪一种?

    在编程中,会遇到很多使用囧然不同风格的开发者,下面是小于所知道的一些,你还知道其它的吗? ? 一、散弹枪编程 ? 这种编程风格是一种开发者使用非常随意的方式对待...

    企鹅号小编
  • this怎么那么难呢?(接上篇-1)

    2019年12月22日,星期六。距离新年还有9天了,宝宝们可以提前想想2020年的目标了。也可以把目标留言在文章下方,目标说给别人听能起到督促自己的作用,不信你...

    用户3258338
  • 深入理解面向对象中的原始类型和引用类型

    我们先前学过的数据类型可以划分成两类:原始类型和引用类型。原始类型的数据都是一些比较简单数据,比如字符串,数字等。引用类型的数据稍微复杂一点,比如对象。

    小周sri的码农
  • js 闭包

    看js闭包,有人出了这个问题, http://www.jb5...

    Dylan Liu
  • jquery判空 string类型的日期比较大小

    if(value.length<=0){ alert("kongzhi"); }

    yuanyuan
  • 纸片人活了!海报上的梅西、漫画里的悟空,都被AI唤醒

    你可能还记得《哈利·波特》里的神奇世界,报纸上的照片会动,墙壁上的名人画像能说话,甚至开门入户都要与“门神”胖夫人暗号问答一番。

    量子位

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动