js对小数进行乘法运算,出现这个问题

3*9.9=29.700000000000003

网上的说法是js的浮点运算bug,这里记录一下。

解决方法是自己写一个运算方法:

转载自: http://www.cnsdn.com.cn/blog/article.asp?id=2079

程序代码
//除法函数,用来得到精确的除法结果
//说明: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);
}

  在你要用的地方包含这些函数,然后调用它来计算就可以了。
  比如你要计算:7*0.8 ,则改成 (7).mul(8)

js 乘法运算 小数问题相关推荐

  1. js做小数运算精度问题

    当js做小数运算时存在bug,大概是因为二进制和十进制转换之间的关系. bug如图 解决方案 1.运算结果后,乘以100再除以100.网上推荐这种方法但是乘以1000再除以1000依然存在精度问题 2 ...

  2. 前端保留两位有效数字_用js取小数点后两位的一些方法

    用js取小数点后两位的一些方法,了解下? Javascript取float型小数点后两位,例22.123456取成22.12,如何做? 1.通过substring截取.function getnum( ...

  3. js 将小数转为科学记数法

    js 将小数转为科学记数法 例如将数字0.00342331转化为3.42331×10^-3的方式展示 先用toExponential方法把数字转为科学记数法的字符串,在用正则表达式将小数部分与10的几 ...

  4. vue 使用 currency.js 处理 小数的相加减 精度问题

    vue 使用 currency.js 处理 小数的相加减 精度问题 安装 currency.js npm install --save currency.js 或者 yarn add currency ...

  5. JS保留小数点后有效数字两位

    JS保留小数点后有效数字两位 在想保留小数点后有效数字保留两位时,需用到嵌套方法一层一层的去判断当前位数的数字是否为有效数字,但如遇到小数点过多的数字,js语法会将其自动变为科学记数法进行保存,所以在 ...

  6. Js 对小数的处理(科学计数法 , 显示精度)

    对数字进行格式化输出,是非常有意义的一件事情,例如许多时候,我们希望一个数字能够输出为指定格式的字符串,拿25.9878来说,我们可能会希望它能保留两位小数来说出,即结果为25.99,或者对于0.34 ...

  7. js取小数点后两位数的方法

    四舍五入以下处理结果会四舍五入:toFixed( ) var num =2.446242342; num = num.toFixed(2); // 输出结果为 2.45 不四舍五入以下处理结果不会四舍 ...

  8. js计算浮点数出现小数;解决js计算小数问题;js数组相加出现小数;

    原博1 原博2 方案1和方案2都是有效的 情景: 在计算浮点数时候,出现多余小数. 例如: 1.11 + 1 = 2.1100000000000003 为什么计算小数会出现误差? 浮点数值的最高进度是 ...

  9. js 取小数整数部分

    1.丢弃小数部分,保留整数部分 js:parseInt(7/2) 2.向上取整,有小数就整数部分加1 js: Math.ceil(7/2) 3,四舍五入. js: Math.round(7/2) 4, ...

最新文章

  1. TTL电平、CMOS电平、RS232电平的区别
  2. 基于MNIST的GANs实现【Pytorch】
  3. pythonselenium获取html标签内容_python selenium 如何获取网页页面所有可以点击的元素?...
  4. 游戏性能优化技术干货分享——内存管理
  5. 彻底弄懂为什么不能把栈上分配的数组(字符串)作为返回值
  6. windows10把单独文件固定到开始屏幕
  7. 《流畅的Python》读书笔记——Python一等函数
  8. RDPWrap1.6.2让windows家庭版Home实现远程桌面
  9. 射频芯片ATE测试从入门到放弃之基本概念
  10. 富爸爸系列:富爸爸穷爸爸实践
  11. C++学习45 流成员函数put输出单个字符 cin输入流详解 get()函数读入一个字符
  12. anaconda prompt和cmd和powershell和anaconda powershell prompt和git bash有什么区别
  13. 十年生死两茫茫,当我们已不再年轻——焦版小李飞刀
  14. 都有云技术了,传统动态vps还有什么用?
  15. 深入理解计算机系统(第三版)家庭作业 第八章
  16. AG256SL100 与EPM240T100 完全PIN TO PIN兼容
  17. Linux大全——Linux系统学习资源合集
  18. ocx插件: AniGIF.ocx安装
  19. html 画星星的坐标,如何使用画布HTML5绘制星星?
  20. 三、安装 Entity Framework Core

热门文章

  1. unity2D备忘志(二)
  2. 【2023秋招】10月19日华为通用软件开发三道题
  3. 我的世界java爱的暮色森林_《我的世界》MC暮色森林四大魔法树,最后一个太神秘而未知作用!...
  4. 惠普暗影精灵 8 台式机 评测
  5. 领导者需要掌握的艺术
  6. 怎么去除视频水印不留痕迹?试试这几个方法吧
  7. 入耳式蓝牙耳机什么牌子好,618适合学生党的蓝牙耳机推荐
  8. 云南茶叶品类详细介绍,不少于500字数
  9. matlab 周期0-1,周期为2s的方波信号,在【-1 0】取值为-1,在【0 1】取值为1,利用matlab求该方波信号的傅里叶级数展开各项系数...
  10. 做好过冬准备 滴滴宣布将裁员15% 涉及员工超2000人