前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >javascript(js)的小数点乘法除法问题

javascript(js)的小数点乘法除法问题

作者头像
Java架构师必看
发布于 2021-03-22 07:35:03
发布于 2021-03-22 07:35:03
4.6K0
举报
文章被收录于专栏:Java架构师必看Java架构师必看

一、用js计算

12.32 * 7  结果是多少?

答案:86.24000000000001

为什么会出现这种问题?怎么解决?

js在处理小数的乘除法的时候有一个bug,解决的方法可以是:将小数变为整数来处理。

以上的计算可以改为:

12.32 * 100 * 7 /100

得出的结果是:86.24,正确。

另外再计算一下:

8.80 * 100 * 12 / 100

结果:105.60000000000002

38.80也会出现类似的问题。

精确度增加10倍:

8.80 * 1000 * 12 / 1000

结果:105.6

正常了。

16.40 * 1000000 * 6 / 1000000

结果也有问题

为了让js执行的更准确,在以后的js小数计算中直接将值扩大10000倍,再除以10000,就可以解决问题。

var num = 38.80;

var num2 = 13;

alert(num * 10000 * 12 / 10000);

被乘和除的这个数经过测试10000最合适,小了有些数字出问题,大了(1000000)有些数字也出问题。

二、

<script defer>

Number.prototype.rate=function(){

varoStr=this.toString();

if(oStr.indexOf(".")==-1)

return1;

else

returnMath.pow(10,parseInt(oStr.length-oStr.indexOf(".")-1));

}

functiontran(){

args=tran.arguments;

vartemp=1;

for(i=0;i<args.length;i++)

temp*=args[i]*args[i].rate();

for(i=0;i<args.length;i++)

temp/=args[i].rate();

returntemp

}

alert(tran(11,22.9));

</script>

该解决 办法是比较麻烦的办法,但是却能让你大概了解解决这个问题的实际过程。

//除法函数,用来得到精确的除法结果

//说明: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);

}

本文由来源 21aspnet,由 javajgs_com 整理编辑,其版权均为 21aspnet 所有,文章内容系作者个人观点,不代表 Java架构师必看 对观点赞同或支持。如需转载,请注明文章来源。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
通用封装函数——四则运算
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
cnguu
2020/10/23
5140
你可能不知道的10个JavaScript小技巧
尽管我使用Javascript来做开发有很多年了,但它常有一些让我很惊讶的小特性。对于我来说,Javascript是需要持续不断的学习的。在这篇文章中,我将列出10个Javascript使用小技巧,主要面向Javascript新手和中级开发者。希望每个读者都能至少从中学到一个有用的技巧。
用户8983410
2021/09/19
3090
javascript(js)小数精度丢失的解决方案
原因:js按照2进制来处理小数的加减乘除,在arg1的基础上 将arg2的精度进行扩展或逆扩展匹配,所以会出现如下情况.
全栈程序员站长
2022/07/15
2.8K0
js实现小数的算术运算方法
<!DOCTYPE html> <html> <head> <title></title> </head> <body>
botkenni
2019/09/03
4.6K0
js实现小数的算术运算方法
js高精度浮点数运算
贴代码:  // 自定义高精度浮点数运算 // 对象格式写法 var float_calculator={ /** * 1.记录两个运算数小数点后的位数 * 2.将其转化为整数类型进行运算 * 3.移动小数点的位置 **/ add:function(arg1,arg2){ var r1,r2,m; try{ //取小数位长度 r1=arg1.toString().split(".")[1].length; r2=arg2.toString().split(".")
lonelydawn
2018/02/09
6.5K0
js高精度浮点数运算
学会JavaScript手写代码秘籍14道常用api
原文:https://juejin.cn/post/7124163407577612302
达达前端
2022/10/31
3160
Vue 过滤器(filters)的使用、封装、批量全局定义及常用实例分享
可以用在 双花括号插值和 v-bind 表达式,其中 v-bind 从 2.1.0+ 开始支持。
德顺
2021/05/17
3.2K0
javascript你必须知道的面试题
从上面的输出结果可知,typeof bar === "object" 并不能准确判断 bar 就是一个 Object。可以通过 Object.prototype.toString.call(bar) === "[object Object]" 来避免这种弊端:
javascript艺术
2021/05/28
7080
javascript你必须知道的面试题
JavaScript 总结(前端常用工具类的封装)
JavaScript (class是ES6的新东西,看着不爽可以变,但主要还是里面的方法) 1. type 类型判断 class TypeFn { isString (o) { //是否字符串 return Object.prototype.toString.call(o).slice(8, -1) === 'String' } isNumber (o) { //是否数字 return Object.prototype.toString.call(o
纪莫
2018/04/19
2.5K1
js float运算精度问题
先放个前辈的文章:JavaScript数字精度丢失问题总结 今天遇到了19.99*100的问题,答案不等于1999,因为在javascript中浮点数的计算是以2进制计算的。自己写了一波解决方法(不能单纯的乘Math.pow(10,N)变成整数运算完再除掉,因为乘也会有精度问题,就像题面19.99*100不等于1999。): function formatFloat(num1,num2){ var str1 = num1.toString(); var str2 = num2.toStrin
mcq
2018/06/27
9.8K2
一些面试题集合
实现一个 sleep 函数,比如 sleep(1000),意味着等等1000毫秒,可从Promise、Generator、Async/Await等角度实现
epoos
2022/06/06
1810
《JavaScript程序设计》第2课:JS类型系统
JS类型系统可以分为标准类型和对象类型,进一步标准类型又可以分为原始类型和引用类型,而对象类型又可以分为内置对象类型、普通对象类型、自定义对象类型。 1. 标准类型 标准类型共包括了6个分别是:und
陈树义
2018/04/13
8520
《JavaScript程序设计》第2课:JS类型系统
大话 JavaScript(Speaking JavaScript):第十一章到第十五章
JavaScript 对所有数字都使用单一类型:它将它们全部视为浮点数。但是,如果小数点后没有数字,则不显示小数点:
ApacheCN_飞龙
2024/01/12
6540
js浮点数加减乘除
版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/article/details/77447842
空空云
2018/09/27
2.3K0
js数字计算精度问题修正
程序计算是一个很普遍的存在,但是语言的计算精度却是一个困扰人的问题,比说说,计算0.1+0.2,0.3+0.6,不用计算机计算,你用口算当然可以计算出分别为0.3和0.9,但是计算机计算的结果却不一样
OECOM
2020/07/01
3.2K0
JavaScript基础①
你点我一下试试 <a href="javascript: alert('kick your ass');">你点我一下试试</a>
ymktchic
2022/01/18
2.9K0
JavaScript基础①
JavaScript 浮点数陷阱及解法
众所周知,JavaScript 浮点数运算时经常遇到会 0.000000001 和 0.999999999 这样奇怪的结果,如 0.1+0.2=0.30000000000000004、1-0.9=0.09999999999999998,很多人知道这是浮点数误差问题,但具体就说不清楚了。本文帮你理清这背后的原理以及解决方案,还会向你解释JS中的大数危机和四则运算中会遇到的坑。
laixiangran
2018/10/22
1.8K0
JavaScript 浮点数陷阱及解法
BiugleJS
老猫-Leo
2023/12/11
1710
JS 的 call apply bind 方法
js的call apply bind 方法都很常见,目的都是为了改变某个方法的执行环境(context)
书童小二
2018/09/03
1.6K0
JS 的 call  apply  bind 方法
JS面向对象笔记
0、匿名函数定以后直接调用:(function(numA, numB) { alert(numA + numB); })(3,4);//弹窗7
tandaxia
2018/09/27
7.5K0
相关推荐
通用封装函数——四则运算
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档