javascript 整数加减会有精度丢失吗
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javascript 整数加减会有精度丢失吗相关的知识,希望对你有一定的参考价值。
参考技术A 你试试看 0.1 + 0.7,也是一样有精度丢失的例如 0.1 + 0.1,在 JS 下用直接输出是 0.2,然而这只是因为默认情况下直接输出的话是有 17 位小数的,然而误差出现在 17 位小数之后。。。
0.1 + 0.1 在 20 位小数的情况下是 0.20000000000000001110
-本回答被提问者采纳 参考技术B 不会哦。。。。。
JS解决加减乘除浮点类型丢失精度问题
JS解决加减乘除浮点类型丢失精度问题
当我们在前端使用js来执行运算时,会有丢失精度的问题。
例如:
console.log("使用js原生态方法");
console.log(" 1.01 + 1.02 ="+(1.01 + 1.02));
console.log(" 1.01 - 1.02 ="+(1.01 - 1.02));
console.log(" 0.000001 / 0.0001 ="+(0.000001 / 0.0001));
console.log(" 0.012345 * 0.000001 ="+(0.012345 * 0.000001));
???
-----------------------------------
输出结果:
使用js原生态方法
1.01 + 1.02 =2.0300000000000002
1.01 - 1.02 =-0.010000000000000009
0.000001 / 0.0001 =0.009999999999999998
0.012345 * 0.000001 =1.2344999999999999e-8
解决方法:
<script type="text/javascript">
??? // 两个浮点数求和
??? function accAdd(num1,num2){
?????? var r1,r2,m;
?????? try{
?????????? r1 = num1.toString().split(‘.‘)[1].length;
?????? }catch(e){
?????????? r1 = 0;
?????? }
?????? try{
?????????? r2=num2.toString().split(".")[1].length;
?????? }catch(e){
?????????? r2=0;
?????? }
?????? m=Math.pow(10,Math.max(r1,r2));
?????? // return (num1*m+num2*m)/m;
?????? return Math.round(num1*m+num2*m)/m;
??? }
?? ?
??? // 两个浮点数相减
??? function accSub(num1,num2){
?????? var r1,r2,m;
?????? try{
?????????? r1 = num1.toString().split(‘.‘)[1].length;
?????? }catch(e){
?????????? r1 = 0;
?????? }
?????? try{
?????????? r2=num2.toString().split(".")[1].length;
?????? }catch(e){
?????????? r2=0;
?????? }
?????? m=Math.pow(10,Math.max(r1,r2));
?????? n=(r1>=r2)?r1:r2;
?????? return (Math.round(num1*m-num2*m)/m).toFixed(n);
??? }
??? // 两个浮点数相除
??? function accDiv(num1,num2){
?????? var t1,t2,r1,r2;
?????? try{
?????????? t1 = num1.toString().split(‘.‘)[1].length;
?????? }catch(e){
?????????? t1 = 0;
?????? }
?????? try{
?????????? t2=num2.toString().split(".")[1].length;
?????? }catch(e){
?????????? t2=0;
?????? }
?????? r1=Number(num1.toString().replace(".",""));
?????? r2=Number(num2.toString().replace(".",""));
?????? return (r1/r2)*Math.pow(10,t2-t1);
??? }
?? ?
// 两个浮点数相乘
??? function accMul(num1,num2){
?????? var m=0,s1=num1.toString(),s2=num2.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);
??? }
?? ?
? </script>
?
? <script>
console.log("使用js原生态方法");
??? console.log(" 1.01 + 1.02 ="+(1.01 + 1.02));
??? console.log(" 1.01 - 1.02 ="+(1.01 - 1.02));
??? console.log(" 0.000001 / 0.0001 ="+(0.000001 / 0.0001));
??? console.log(" 0.012345 * 0.000001 ="+(0.012345 * 0.000001));
??? console.log("-----------------");
??? console.log("使用自定义方法");
??? console.log(" 1.01 + 1.02 ="+accAdd(1.01,1.02));
??? console.log(" 1.01 - 1.02 ="+accSub(1.01,1.02));
??? console.log(" 0.000001 / 0.0001 ="+accDiv(0.000001,0.0001));
??? console.log(" 0.012345 * 0.000001 ="+accMul(0.012345,0.000001));
? </script>
------------------
输出结果
使用js原生态方法
1.01 + 1.02 =2.0300000000000002
1.01 - 1.02 =-0.010000000000000009
0.000001 / 0.0001 =0.009999999999999998
0.012345 * 0.000001 =1.2344999999999999e-8
-----------------
使用自定义方法:
1.01 + 1.02 =2.03
1.01 - 1.02 =-0.01
0.000001 / 0.0001 =0.01
0.012345 * 0.000001 =1.2345e-8
以上是关于javascript 整数加减会有精度丢失吗的主要内容,如果未能解决你的问题,请参考以下文章
浏览器响应数据long型超长自动转换精度丢失-JavaScript 整数精度丢失问题-springboot解决Long类型数据传入前端损失精度