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

发布时间 - 2026-01-10 23:19:08    点击率:

问题:

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数字数值运算后值不对的解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# js  # number  # 运算  # JavaScript数值类型知识汇总  # js构建二叉树进行数值数组的去重与优化详解  # js 两数组去除重复数值的实例  # js中字符型和数值型数字的互相转化方法(必看)  # JS比较两个数值的大小实例  # JavaScript前端开发时数值运算的小技巧  # 会有  # 浮点  # 比较明显  # 返回值  # 给大家  # 浮点数  # 解决方法  # 就可以  # 这是  # 算出来  # 四舍五入  # 你要  # 是这样  # 两位  # 希望能  # 就把  # 要用  # 写了  # 我先  # 这篇 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在建站之星网店版论坛获取技术支持?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  Laravel集合Collection怎么用_Laravel集合常用函数详解  JavaScript如何实现音频处理_Web Audio API如何工作?  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  微信小程序 闭包写法详细介绍  Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载  PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑  如何破解联通资金短缺导致的基站建设难题?  如何用VPS主机快速搭建个人网站?  PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)  Claude怎样写约束型提示词_Claude约束提示词写法【教程】  网站制作软件免费下载安装,有哪些免费下载的软件网站?  如何基于云服务器快速搭建网站及云盘系统?  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  Laravel如何实现事件和监听器?(Event & Listener实战)  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  如何用PHP快速搭建高效网站?分步指南  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  JavaScript常见的五种数组去重的方式  如何在阿里云购买域名并搭建网站?  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  C#如何调用原生C++ COM对象详解  如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环  如何在万网利用已有域名快速建站?  Laravel如何实现文件上传和存储?(本地与S3配置)  详解vue.js组件化开发实践  Swift中swift中的switch 语句  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  Laravel模型关联查询教程_Laravel Eloquent一对多关联写法  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势  谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复  Laravel如何配置Horizon来管理队列?(安装和使用)  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  昵图网官网入口 昵图网素材平台官方入口  Laravel如何创建自定义中间件?(Middleware代码示例)  Laravel如何处理异常和错误?(Handler示例)  用v-html解决Vue.js渲染中html标签不被解析的问题  如何安全更换建站之星模板并保留数据?  如何打造高效商业网站?建站目的决定转化率  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  Laravel Seeder填充数据教程_Laravel模型工厂Factory使用