问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

js 怎样精确计算除法,没有精度缺失?

发布网友 发布时间:2022-04-27 03:32

我来回答

3个回答

懂视网 时间:2022-05-14 21:57

一个精确的计算对于一个项目来说是至关重要的,那么如何在js中实现算数运算的精确计算呢?下面这篇文章给大家分享的就是js实现的精确计算。

JS无法进行精确计算的bug

在做CRM,二代审核需求审核详情页面时。需要按比例(后端传类似0.8的小数)把用户输入的数字显示在不同的地方。
在做dubheInvest = invest * (1 - ratio);运算时发现问题。具体如下:
示例代码:

console.log( 1 - 0.8 ); //
输出 0.19999999999999996 console.log( 6 * 0.7 ); //输出 4.199999999999999 console.log( 0.1 + 0.2 ); //输出 0.30000000000000004 console.log( 0.1 + 0.7 ); //输出 0.7999999999999999 console.log( 1.2 / 0.2 ); //输出 5.999999999999999

通过上面举出的例子可以看到,原生的js运算结果不一定准确,会丢失精度。
解决方案

解决方案的原理是,将浮点数乘以(扩大)10的n次方倍,把浮点数变为整数后再进行相应的运算,最后将得到的结果除以(缩小)10的n次方倍。
原理示例:

将 console.log(1-0.8); 变为 console.log((1 * 10 - 0.8 * 10) / 10); 即可得到正确的值
根据上述原理,可以封装一些方法出来解决此类问题。如下所示(Math.pow(x, y);表示求x的y次方):

//加法运算 
function floatAdd(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; 
} 
 
//减法运算 
function floatSub(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)); 
 //动态控制精度长度 
 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(); 
 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); 
} 
 
 
//除法运算 
function floatp(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){} 
 
 r1=Number(arg1.toString().replace(".","")); 
 
 r2=Number(arg2.toString().replace(".","")); 
 return (r1/r2)*Math.pow(10,t2-t1); 
}

热心网友 时间:2022-05-14 19:05

//浮点数加法运算
function FloatAdd(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
}

//浮点数减法运算
function FloatSub(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));
//动态控制精度长度
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();
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)
}

//浮点数除法运算
function FloatDiv(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);
}
}
===============================================
1.丢弃小数部分,保留整数部分parseInt(5/2)
2.向上取整,有小数就整数部分加1
Math.ceil(5/2)
3,四舍五入.
Math.round(5/2)
4,向下取整
Math.floor(5/2)

参考资料:http://hi.baidu.com/anyu340304/item/50e2d23ca5e3d0c0382ffae3

热心网友 时间:2022-05-14 20:23

//除法函数,用来得到精确的除法结果
//返回值: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);
}
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
楼栋放大器楼栋放大器性能参数举例 中国有哪些山名 win7网络感叹号无法上网怎么解决-windows7网络出现黄三角感叹号修复办法... win7连接wifi黄色感叹号怎么解决 win7连接wifi黄色感叹号解决方法_百度... win7网络黄色感叹号怎么修复 win7网络黄色感叹号怎么解决 win7电脑网络连接有个感叹号为什么WIN7系统网络会出现感叹号 格力空调为什么会停机一段时间? 格力空调为什么停机了? 济南大学和山师哪个好 山东师范大学和济南大学哪个比较好 高中数学人教A版选修2-1第三章《3.1.2 空间向量的数乘运算》优质课公开课教案教师资格证面试试讲教案 请问复读生能不能在家自学,高考报名的时候直接找教育局报名??? 这段linux命令什么意思“join -t ':' /etc/passwd /etc/shadow | head... js parsefloat 精度丢失 空间向量如何计算? 复读可以在家自学吗知乎 linux命令的实例 js数值相加问题 急求! 高三复读生在家自学怎么报名参加高考 js的乘法运算为什么不精确呢? 空间向量及其运算分别是? 使用linux 命令截取a文件的前100行 我使用的命令是 head -100 a.txt >test.txt 请问复读生能不能在家自学,高考报名的时候直接找教育局报名???需要学籍吗,麻烦大佬告知 js哪些运算精度丢失 想复读 而且想在家自学 但要怎么才能参加高考 javascript 整数加减会有精度丢失吗 复读可以在家自学吗? js 中Math.round()精度问题?急 复读生以在家自学的方式去报考是以什么方式的报考?社会考生还是普通考生? JavaScript为什么浮点数会丢失精度 linux 容易混淆的几个基本命令 空间向量运算法则 高考落榜以后我复读在家自学然后报名时间是什么时候 js乘法精度计算代码 求解释 空间向量的乘法计算 java丢失精度问题 为什么javascript小数相减会出现一长串的小数位数? 空间向量及其加减运算 linux命令 find . -type f -exec du -k {} \; | sort -nrk 1 | head 鹅绒被和驼绒被哪个好,驼绒被薄一点,鹅绒松一点,那个暖一点 js parsefloat 精度问题 湾仔码头水饺转基因 第三章空间向量与立体几何 3.1空间向量及其运算 课后习题 经常吃湾仔码头水饺好吗?听说是转基因呢? javascript string 转float 精度问题 关于空间向量的运算 js中的数字相乘为什么结果偏差 急求!如何在windows8上实现linux的head命令。-c,-v,-n,--help,--v JS 加法保留2位小数 空间向量运算