当前位置:首页 > 日记 > 正文

js中Number数字数值运算后值不对的解决方法

js中Number数字数值运算后值不对的解决方法

问题:

37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数)

我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998

怎么会这样,两个只有一位小数的数字相乘,怎么可能多出这么小数点出来。

我Google了一下,发现原来这是JavaScript浮点运算的一个bug。

比如:7*0.8 JavaScript算出来就是:5.6000000000000005

解决方法:网上找到了一些解决办法,就是重新写了一些浮点运算的函数。

下面就把这些方法摘录下来,以供遇到同样问题的朋友参考:

程序代码

//除法函数,用来得到精确的除法结果//说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。//调用:accDiv(arg1,arg2)//返回值:arg1除以arg2的精确结果function accDiv(arg1,arg2){ var t1=0,t2=0,r1,r2; try{t1=arg1.toString().split(".")[1].length}catch(e){} try{t2=arg2.toString().split(".")[1].length}catch(e){} with(Math){ r1=Number(arg1.toString().replace(".","")) r2=Number(arg2.toString().replace(".","")) return (r1/r2)*pow(10,t2-t1); }}//给Number类型增加一个div方法,调用起来更加方便。Number.prototype.div = function (arg){ return accDiv(this, arg);}//乘法函数,用来得到精确的乘法结果//说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。//调用:accMul(arg1,arg2)//返回值:arg1乘以arg2的精确结果function accMul(arg1,arg2){ var m=0,s1=arg1.toString(),s2=arg2.toString(); try{m+=s1.split(".")[1].length}catch(e){} try{m+=s2.split(".")[1].length}catch(e){} return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m)}//给Number类型增加一个mul方法,调用起来更加方便。Number.prototype.mul = function (arg){ return accMul(arg, this);}//加法函数,用来得到精确的加法结果//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。//调用:accAdd(arg1,arg2)//返回值:arg1加上arg2的精确结果function accAdd(arg1,arg2){ var r1,r2,m; try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0} try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0} m=Math.pow(10,Math.max(r1,r2)) return (arg1*m+arg2*m)/m}//给Number类型增加一个add方法,调用起来更加方便。Number.prototype.add = function (arg){ return accAdd(arg,this);}

减法函数

function accSub(arg1, arg2) {var r1, r2, m, n;try { r1 = arg1.toString().split(".")[1].length } catch (e) { r1 = 0 }try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 }m = Math.pow(10, Math.max(r1, r2));//last modify by deeka//动态控制精度长度n = (r1 >= r2) ? r1 : r2;return ((arg1 * m - arg2 * m) / m).toFixed(n);}

在你要用的地方包含这些函数,然后调用它来计算就可以了。

比如你要计算:7*0.8 ,则改成 (7).mul(8)

其它运算类似,就可以得到比较精确的结果。

以上这篇js中Number数字数值运算后值不对的解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

相关文章

通过命令行创建vue项目的方法

通过命令行创建vue项目的方法

项目,方法,命令行,电脑软件,vue,最近想要学习vue,正好看到资料,如何通过命令创建vue项目的方法,就留个笔记环境要求: 安装有 Node.js、 vue、vue-cli 。创建项目:vue init webpack projectName进入项目,下载依赖:npm install 或者 cnpm install运…

word中怎么设置两种页码word中设置

word中怎么设置两种页码word中设置

设置,方法,步骤,两种,页码,  在办公自动化的时候,有时候需要添加多种页码的,但,难道只能将主文档分为两个文件后再添加页码吗?那么下面就由小编给大家分享下技巧,希望能帮助到您。word中设置两种页码的步骤步骤一:打开要添加多种页码的文档,然…

Bootstrap 设置datetimepicker在屏

Bootstrap 设置datetimepicker在屏

设置,屏幕,方法,弹出,电脑软件,datetimepicker默认是在输入框下面弹出的,但是遇到输入框在屏幕下面时,日期选择框会有一部分在屏幕下面,显示不了,因此需要能够从上面弹出。设置很简单,在初始话中:$('.form_date').datetimepicker({ langu…

ps怎么制作一个漂亮的星空效果背景

ps怎么制作一个漂亮的星空效果背景

背景图,星空,效果,漂亮,电脑软件,在photoshop中用滤镜制作一些效果,可以减少许多工作量。比如制作星空效果,只要在黑色背景中添加杂色,稍微模糊一下,再用色阶调整黑白对比度即可完成。软件名称:Adobe Photoshop 8.0 中文完整绿色破解版软件大小:1…

ps怎么设计虚边效果的文字?

ps怎么设计虚边效果的文字?

文字,效果,电脑软件,ps,ps输入的文字想哟啊制作虚边的效果,该怎么制作呢?下面我们就来看看详细的教程。软件名称:Adobe photoshop CC 2016 v16.1.2 32位 官方安装中文版软件大小:211MB更新时间:2016-10-131、新建一个RGB模式文件,设置前景色为黑…

微信小程序访问node.js接口服务器

微信小程序访问node.js接口服务器

服务器搭建,教程,接口,程序,电脑软件,前言最近在做微信的应用号小程序开发,小程序的后台数据接口需要https安全请求,所以需要我的nodejs服务器能够提供https的支持,现在就将整个https服务器的搭建过程说一下。搭建教程如下:首先,我试了一下以前…

ppt2010中的艺术字怎样制作

ppt2010中的艺术字怎样制作

方法,设置,映像,艺术字,电脑软件,  ppt为我们提供了丰富的艺术字体,我们也可以对艺术字设置样式,例如将艺术字设置为映像的效果,下面就让小编告诉你ppt2010设置映像艺术字的方法,欢迎大家来到学习。ppt2010设置映像艺术字的方法打开一个PPT,选…

JavaScript学习笔记之函数记忆

JavaScript学习笔记之函数记忆

函数,学习笔记,记忆,电脑软件,JavaScript,本文讲解函数记忆与菲波那切数列的实现,分享给大家,具体如下定义函数记忆是指将上次的计算结果缓存起来,当下次调用时,如果遇到相同的参数,就直接返回缓存中的数据。举个例子:function add(a, b) { retu…

怎样用PS制作个性化的签名水印用PS

怎样用PS制作个性化的签名水印用PS

方法,水印,电脑软件,PS,  很多人都喜欢在作品上加入水印,用以保障相片的版权。下面是PS制作个性化签名水印的方法,希望小编整理的对你有用,欢迎阅读。用PS制作个性化的签名水印的方法用PS制作个性化的签名水印的方法图1  1、先签个大名真…

详解如何使用webpack在vue项目中写

详解如何使用webpack在vue项目中写

语法,项目,如何使用,详解,电脑软件,本文介绍了如何使用webpack在vue项目中写jsx语法,分享给大家,具体如下:我们知道Vue 2.0中对虚拟DOM的支持。我们可以通过JavaScript动态的创建元素,而不用在template中写HTML代码。虚拟DOM最终将被渲染为真…

JS禁止浏览器右键查看元素或按F12

JS禁止浏览器右键查看元素或按F12

元素,右键,审查,示例代码,浏览器,前言很多站长为了仿止别人仿制或扒下自己的网页,都会选择使用禁止浏览器右键查看元素或F12审查元素,一旦查看元素浏览器页面就会自动关闭,下面话不多说了,来一起看看详细的介绍吧。注:该代码不兼容火狐浏览器,对…

微信小程序 空白页重定向解决办法

微信小程序 空白页重定向解决办法

重定向,解决办法,程序,空白页,电脑软件,微信小程序 空白页重定向解决办法 在刚开始的时候将小程序的入口文件直接指向tabbar 的首页,此时出现问题:二维码扫描,第一次不关闭首页,第二次进入时;不会经过onLoad过程解析scene参数;官方中解释:tabbar…