JS中对数字(含有小数的)进行相乘后,数值不正确,多了好多位

js小数运算出现多位小数如何解决 和大家分享一个有趣的测试: 0.1+0.2 == 0.3 //false 顿时郁闷,好吧!原来0.1+0.2变成:0.30000000000000004 再来一个 2.4/0.8 =>2.9999999999999996 没办法换种方式,都转换成整数 (2.4 * 100)/(0.8 * 100) 10.22 现在要减去 0.11 结果值又出现了很多的小数 10.110000000000001,然后我就用了 toFixed 方法来过滤小数,但是不知道跟前面那种转换成整数后再执行哪种效率高,好!还是试下再说吧! var date1 = new Date(); for(var i = 0; i 立即下载

       现在用IE8开发项目,好多兼容问题啊,今天写完页面,测试的时候,偶然遇到了个小数相乘的问题,代码没有错,后来找了一下博客,才发现原来是JS浮点运算的bug,特地记录了一下,避免我忘记,另外,方便大家共同学习。

问题:

  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 Subtr(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)  

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

转载自:点击打开原博客

Javascript浮点数乘积运算出现多位小数的解决方法 主要介绍了Javascript浮点数乘积运算出现多位小数的解决方法,需要的朋友可以参考下 立即下载

相关推荐

断点回归(regression discontinuity design)学习笔记

本篇博文主要是对断点回归的一些学习和总结~ 学习材料如下: 1 断点回归设计RDD分类与操作案例 2 RDD断点回归, Stata程序百科全书式的宝典 3 断点回归设计的前沿研究现状, RDD 4 让“跳跃”更有意义:断点回归设计(RDD) 5 Stata: 断点回归 (RDD) 教程 6 怎么用通俗的语言解释断点回归?它与DID的区别是什么 7 Watering Down Environmental Regulation in China,Guojun He, Shaoda Wang, Bing Zhan

Claire_chen_jia的博客 9万+

解决JS中计算出现无限小数位问题

在项目中遇到了浮点数转换为百分数的问题,用浮点数乘以100结果产生了一堆小数位。查资料发现原因是由于计算机计算会先把数字转换成二进制计算,然后在转换为10进制,导致精度丢失。对一些方法进行了封装

weixin_56242672的博客 4994

VSCode + ESP-IDF 项目搭建及配置

VSCode 搭建 ESP-IDF 开发环境

weixin_51358957的博客 2万+

js两数相乘出现多小数

问题截图如上: 解决办法: 当前页面 购买次数 *100 * 单价 / 100

JiAyInNnNnN123的博客 4375

链路聚合Eth-trunk以及华为交换机配置实例

链路聚合简介 以太网链路聚合Eth-Trunk简称链路聚合,它通过将多条以太网物理链路捆绑在一起成为一条逻辑链路,从而实现增加链路带宽的目的。同时,这些捆绑在一起的链路通过相互间的动态备份,可以有效地提高链路的可靠性。 目的: 随着网络规模不断扩大,用户对骨干链路的带宽和可靠性提出越来越高的要求。在传统技术中,常用更换高速率的接口板或更换支持高速率接口板的设备的方式来增加带宽,但这种方案需要付出高额的费用,而且不够灵活。 采用链路聚合技术可以在不进行硬件升级的条件下,通过将多个物理接口捆绑为一个逻辑接口

ChaseAug的博客 2万+

竞赛无人机模块化开发实战:2023 TI电赛G题空地协同消防系统(飞控与视觉融合篇)

本文以2023年TI电赛G题为例,详细阐述了采用模块化开发思维构建空地协同智能消防系统的实战方法。文章重点拆解了无人机飞控二次开发、视觉识别与融合控制等核心模块,提供了硬件选型、代码实现与系统联调的完整指南,旨在帮助参赛者通过“搭积木”式编程高效完成复杂系统集成。

js777的博客 454

js二个小数相乘结果出现很多小数点

二个小数相乘有时的结果 html页面的 <div id="banner"> 第一个小数:<input type="text" id="num1"/> <br/> 第二个小数:<input type="text" id="num2"/> <br/> <input type="button" value="计算" ...

微笑的博客 4433

手把手教你理解特斯拉Model 3的域控制器架构:RBCM如何成为“多面手”?

本文深入解析特斯拉Model 3的域控制器架构,重点介绍右车身域控制器(RBCM)如何整合车身电子系统功能。RBCM作为多任务处理中枢,管理空调系统、尾部电气设备和超声波雷达等关键功能,展现了特斯拉在汽车电子架构上的创新设计。文章详细探讨了RBCM的硬件架构、功能版图及信号网络,揭示其如何通过高性能MCU和智能开关技术实现功能集中与效率提升。

weixin_30919429的博客 383

JS中对数字(含有小数的)进行相乘后,数值不正确的问题

之前测试的时候,偶然遇到了个小数相乘的问题,后来找了一下博客,才发现原来是JS浮点运算的问题,故在此记录了一下,避免我忘记。

LiXiaoJin's Blog 1562

剪映专业版关键帧完全教程:从原理到实战的动画必修课

关键帧是视频动画的核心原理。视频由连续静止画面(帧)构成,关键帧记录素材属性变化的起始与结束状态,中间过渡帧由软件自动计算生成。剪映专业版中,视频、音频、文本、贴纸等素材均支持关键帧动画,可调节位置、缩放、旋转、不透明度、音量等参数。操作为:在起始位置点击参数旁菱形按钮添加关键帧,移动播放头后调整参数,系统自动生成第二个关键帧。多属性可独立控制并叠加,实现放大同时淡出等复合效果。通过设定变化起点与终点,关键帧能让静止元素产生移动、缩放、淡入淡出等丰富动态,是视频剪辑从基础拼接进阶创意表达的核心技能。掌握关键

深耕计算机专业知识与技术。 2091

29、Power BI 中行级安全(RLS)的实现与应用

本文详细介绍了在Power BI中实现行级安全(RLS)的方法,包括静态RLS和动态RLS的实现流程、适用场景及对比分析。通过具体业务场景,展示了如何创建安全角色、定义规则、验证角色、发布模型以及分配成员。此外,还探讨了更复杂的动态RLS场景,如基于父子层次结构的数据访问控制和从外部源获取用户信息的实现方式。文章最后总结了最佳实践建议及未来发展趋势,为企业在Power BI中高效、安全地实施数据访问控制提供了全面指导。

terraform7cloud的博客 195

JavaScript 小数与整数相乘后小数点后面多出很多位

记一次js遇到的bug–小数与整数相乘后小数点后面多出很多位 今天写前端js代码,数量乘以单价等于金额,其中数量是整数,单价是浮点数,在输入数量是11,单价是22.9的时候,金额变成了251.899998,很明显结果有问题,查了一下,发现是js的浮点运算的bug,可以用**toFixed(2)**来进行约束,也可以先单价和数量各乘以100,相乘,再除以10000,我的代码是下面的, var len...

hanjiale3的博客 4568

Python爬虫实战:利用Selenium与异步技术高效获取雪球财经数据

雪球财经作为国内领先的投资社交平台,汇聚了大量股票数据、财经资讯和投资者观点。对于金融数据分析师、量化投资者和研究人员来说,获取雪球平台的实时数据具有重要价值。然而,雪球网站采用了多种反爬虫机制,包括动态内容加载、请求频率限制和用户行为检测等,使得传统爬虫技术难以有效获取数据。本文将介绍如何使用Python的最新爬虫技术,包括Selenium WebDriver、异步请求处理和智能等待策略,来高效、稳定地爬取雪球财经数据。我们将重点解决以下几个技术难点:动态加载内容的处理登录状态维持与模拟。

2201_76125261的博客 1107

js 小数相乘 四舍五入

今天工作遇到了这个问题,两个小数相乘,会得到小数点后很多位数的数,我想要的是得到一个正常的数字,然后进行四舍五入,来保存两位小数 https://mathjs.org/index.html这个是我用到的科学计数法的插件 先进性安装 npm install mathjs 代码用到的是如下两种 (1) const math = require('mathjs') const...

风华绝代的博客 756

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

js数值相乘精度问题

js中,小数相乘后得到的结果是类似12321321.000000001这么长的数字。 解决方法: 1)Math.floor() 可以取整; 2)使用bignumber.js进行数值计算 https://github.com/MikeMcl/bignumber.js...

zhuxiaobo09的专栏 4715

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

两个大数相乘(包括小数,负数)

function product (num1, num2) { var sum = [] // 在数组中存倒叙的结果 var fuhao = '' // 判断正负 var point = 0 // 小数点后位数 if (num1 == 0 || num2 == 0) return '0' // 传入数字有0直接返回0 // 判断正负 if(num1[0] == '-') fuhao = '-' if(num2[0] == '-' ){ fuhao = fuh

lu1994520的博客 509

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

php 小数点 乘法,js小数点数字相乘、把小数点四舍五入保留两位小数

//小数点数字相乘functionaccMul(arg1,arg2){varm=0,s1=arg1.toString(),s2=arg2.toString();try{m+=s1.split(".")[1].length}catch(e){}try{m+=s2.split(".")[1].length}catch(e){}returnNumber(s1.replace(".",""))*Nu...

weixin_32243075的博客 402

js数值类型

js数值类型–number js数值类型的存储形式 js数值的范围与精度(有效数位数) js中十进制小数的存储与运算不准确的问题 数值的表示方法 关于js中的NaN 与数值有关的全局方法 js数值类型–number js数值类型的存储形式 JavaScript 内部,所有数字都是以64位浮点数形式储存,即使整数也是如此. 什么是浮点数? 利用科学计数法来表达实数...

peterzhangsnail的博客 2358

js小数运算出现多为小数问题_JS小数运算出现多为小数问题的解决方法

写在前面的话:今天帮同事解决了一个问题,就是小数相乘出现很多位小数的问题;这个问题自己以前也遇到过,现在特意来总结一下;Number类型:Number类型是ECMAScript中最常用和最令人关注的类型了;这种类型使用IEEE754格式来表示整数和浮点数值(浮点数值在某些语言中也被成为双精度数值),为支持各种数据类型,ECMA-262定义了不同的数值面量格式。十进制:var intNum=10; ...

weixin_39831170的博客 362

Vue JS 的乘法精确计算问题,出现很多位小数的问题与原因

出现问题的原因 计算机把小数转换成二级制,会出现无限循环的情况。再把无限循环的二级制转化成十进制的时候,变成了一个无限循环的数字。在处理双精度浮点数的小数部分最多支持 52 位,所以转换成十进制之后,就出现了很多位小数的存在。 解决办法 Vue.prototype.NumberMul = function(arg1, arg2) { var m = 0; var s1 = arg1.toString(); var s2 = arg2.toString(); try

KLW75 6191

js小数运算精度不准的问题

在开发中遇到类似这样的问题: let num1 = 0.1 let num2 = 0.2 console.log(num1 + num2) // 0.30000000000000004 我们发现 0.1 + 0.2 !== 0.3,为什么会出现这样的结果呢? 计算机是通过二进制的方式存储数据的,所以计算机计算0.1 + 0.2的时候,实际上是计算两个数字的二级制的和。0.1的二级制是0.000110011001100...(1100循环),0.2的二进制是0.00110011001100...(11

zq1292071431的博客 3082

js计算精度丢失(decimal.js),去小数位

项目场景: 提示:计算值精度丢失,取小数位 原因: JS 数字丢失精度的原因: JavaScript 中所有数字包括整数和小数都只有一种类型 — Number。它的实现遵循 IEEE 754 标准,使用 64 位固定长度来表示,也就是标准的 double 双精度浮点数(相关的还有float 32位单精度)。为什么呢,因为这样节省存储空间。 也就是说 17652.19 + 7673.78 = 25325.969999999998。其实最简单的例子是 0.1+0.2 = 0.3000000000000000

Z_Wonderful的博客 3363

js 数字加减乘除精度问题,解决小数点后多位小数

在javascript中,当你使用小数进行加减乘除运算时,你会发现,所得到的结果有时后面带有长长的一段小数,使运算变得复杂,并且影响计算结果。上网查询了一下原因,大致如下:在javascript中,带小数的数据运算时总会出现好多位小数.这是因为在javascript中浮点数的计算是以2进制计...

chunxue8373的博客 1594

js除法保留小数_javascript(js)的小数点乘法除法问题详解

一、用js计算12.32 * 7 结果是多少?答案:86.24000000000001为什么会出现这种问题?怎么解决?js在处理小数的乘除法的时候有一个bug,解决的方法可以是:将小数变为整数来处理。以上的计算可以改为:12.32 * 100 * 7 /100得出的结果是:86.24,正确。另外再计算一下:8.80 * 100 * 12 / 100结果:105.6000000000000238....

weixin_35952000的博客 3768

【JavaScript】JavaScript实现大数相乘

在 JavaScript 中处理大数相乘时,由于 Number 类型存在精度限制(最大安全整数为 2⁵³-1),需要特殊处理。

小秀的博客 959
上一篇: String、Object转为double,不损失精度
下一篇: //针对ie8等低版本浏览器document.getElementsByName方法不生效解决方法
Hello_A_Z
博客等级 码龄10年 3粉丝 12原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值