js 怎样精确计算除法,没有精度缺失?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js 怎样精确计算除法,没有精度缺失?相关的知识,希望对你有一定的参考价值。
//浮点数加法运算function FloatAdd(arg1,arg2)
var r1,r2,m;
tryr1=arg1.toString().split(".")[1].lengthcatch(e)r1=0
tryr2=arg2.toString().split(".")[1].lengthcatch(e)r2=0
m=Math.pow(10,Math.max(r1,r2))
return (arg1*m+arg2*m)/m
//浮点数减法运算
function FloatSub(arg1,arg2)
var r1,r2,m,n;
tryr1=arg1.toString().split(".")[1].lengthcatch(e)r1=0
tryr2=arg2.toString().split(".")[1].lengthcatch(e)r2=0
m=Math.pow(10,Math.max(r1,r2));
//动态控制精度长度
n=(r1>=r2)?r1:r2;
return ((arg1*m-arg2*m)/m).toFixed(n);
//浮点数乘法运算
function FloatMul(arg1,arg2)
var m=0,s1=arg1.toString(),s2=arg2.toString();
trym+=s1.split(".")[1].lengthcatch(e)
trym+=s2.split(".")[1].lengthcatch(e)
return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m)
//浮点数除法运算
function FloatDiv(arg1,arg2)
var t1=0,t2=0,r1,r2;
tryt1=arg1.toString().split(".")[1].lengthcatch(e)
tryt2=arg2.toString().split(".")[1].lengthcatch(e)
with(Math)
r1=Number(arg1.toString().replace(".",""))
r2=Number(arg2.toString().replace(".",""))
return (r1/r2)*pow(10,t2-t1);
===============================================
1.丢弃小数部分,保留整数部分parseInt(5/2)
2.向上取整,有小数就整数部分加1
Math.ceil(5/2)
3,四舍五入.
Math.round(5/2)
4,向下取整
Math.floor(5/2)
参考资料:http://hi.baidu.com/duanyu340304/item/50e2d23ca5e3d0c0382ffae3
参考技术A //除法函数,用来得到精确的除法结果//返回值: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);
本回答被提问者采纳
js乘法精度计算代码 求解释
//乘法函数,用来得到精确的乘法结果
//说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
//调用:accMul(arg1,arg2)
//返回值:arg1乘以arg2的精确结果
function accMul(arg1,arg2)
var m=0,s1=arg1.toString(),s2=arg2.toString();
trym+=s1.split(".")[1].lengthcatch(e)
trym+=s2.split(".")[1].lengthcatch(e)
return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m)
求解释两个try语句内代码含义
经过两个try语句后,m值不就是第二个代码的值了么。 这样最后计算就可能出错啊,但实际运行这是个正确的方法,不懂,求解释!
我自己想通了 ,, 通过第二个语句m值不是第二个小数的小数位数,而是变为两个小说的位数之和。
try只是捕获错误,被try包围的语句如果出错了也会继续执行下面的。
这里try里面的语句是获取小数位的长度,假如s1是整数的话s1.split(".")[1].length这句会出错。所以忽略这句,继续执行下面的。
如果不用try的话可以改成下面的
var m = 0,
s1 = arg1.toString(),
s2 = arg2.toString(),
t;
t = s1.split(".");
// 判断有没有小数位,避免出错
if (t[1])
m += t[1].length
t = s2.split(".");
if (t[1])
m += t[1].length
return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m)
追问
谢谢你。 百度给我了个推荐答案,就没注意其它的。其实该选你为答案的
追答那赞一个呗,o(∩_∩)o 哈哈
追问你给我解释清楚了try catch。谢谢!
参考技术Ajs含有小数的计算都会有丢失精度的问题
实际上解决的办法就是
把小数转化为整数计算 并同时记住扩大的倍数
最后把结果缩小这个倍数 得到不丢失精度的结果
try catch 就是捕获异常 如果没有捕获肯定会报错
也就是你现在按流程所设想的
但是catch(e) 是捕获了异常 但是里面并没有任何操作
也就是 越过去了 忽略掉
// 这句就是像将小数点去掉 变成整数 如果没有小数点那就没有变化// 然后计算之后 缩小 10的m次方倍 也就是之前扩大了的倍数
Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m)追问
原理我明白。你回答的和我问的不是一回事。 不过还是谢谢你!
本回答被提问者和网友采纳 参考技术B 注意 第二个try 中用的是m+=而不是 m=.所以实际上 执行两个try 之后m的值是两个浮点数小数位数的和,例arg1=2.3 arg2=3.456 那么就是4,也就是说精确到小数后为,但是实际计算后只能小数只有3位 所以就显示到后三位了追问谢谢你。百度怎么给了我个推荐答案啊,我就把它选了,没看见后面的回答。。 不然在你和上面这个哥们选一个了。 谢谢你能仔细看我代码!
以上是关于js 怎样精确计算除法,没有精度缺失?的主要内容,如果未能解决你的问题,请参考以下文章