js 小数点失精度

解决方法思路:将小数化成整数后再作运算。具体代码如下:

 /**
* 加法运算,避免数据相加小数点后产生多位数和计算精度损失。
*
* @param num1加数1 | num2加数2
*/
function numAdd(num1, num2) {
   var baseNum, baseNum1, baseNum2;
   try {
       baseNum1 = num1.toString().split(".")[1].length;
   } catch (e) {
       baseNum1 = 0;
   }
   try {
       baseNum2 = num2.toString().split(".")[1].length;
   } catch (e) {
       baseNum2 = 0;
   }
   baseNum = Math.pow(10, Math.max(baseNum1, baseNum2));
   return (num1 * baseNum + num2 * baseNum) / baseNum;
};
 

/**
* 减法运算,避免数据相减小数点后产生多位数和计算精度损失。
*
* @param num1被减数  |  num2减数
*/
function numSub(num1, num2) {
   var baseNum, baseNum1, baseNum2;
   var precision;// 精度
   try {
       baseNum1 = num1.toString().split(".")[1].length;
   } catch (e) {
       baseNum1 = 0;
   }
   try {
       baseNum2 = num2.toString().split(".")[1].length;
   } catch (e) {
       baseNum2 = 0;
   }
   baseNum = Math.pow(10, Math.max(baseNum1, baseNum2));
   precision = (baseNum1 >= baseNum2) ? baseNum1 : baseNum2;
   return ((num1 * baseNum - num2 * baseNum) / baseNum).toFixed(precision);
};
 
 

/**
* 乘法运算,避免数据相乘小数点后产生多位数和计算精度损失。
*
* @param num1被乘数 | num2乘数
*/
function numMulti(num1, num2) {
   var baseNum = 0;
   try {
       baseNum += num1.toString().split(".")[1].length;
   } catch (e) {
   }
   try {
       baseNum += num2.toString().split(".")[1].length;
   } catch (e) {
   }
   return Number(num1.toString().replace(".", "")) * Number(num2.toString().replace(".", "")) / Math.pow(10, baseNum);
};
 
 

/**
* 除法运算,避免数据相除小数点后产生多位数和计算精度损失。
*
* @param num1被除数 | num2除数
*/
function numDiv(num1, num2) {
   var baseNum1 = 0, baseNum2 = 0;
   var baseNum3, baseNum4;
   try {
       baseNum1 = num1.toString().split(".")[1].length;
   } catch (e) {
       baseNum1 = 0;
   }
   try {
       baseNum2 = num2.toString().split(".")[1].length;
   } catch (e) {
       baseNum2 = 0;
   }
   with (Math) {
       baseNum3 = Number(num1.toString().replace(".", ""));
       baseNum4 = Number(num2.toString().replace(".", ""));
       return (baseNum3 / baseNum4) * pow(10, baseNum2 - baseNum1);
   }
};
posted @   zhengyan_web  阅读(522)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示