首页 > 其他分享 >js 小数点计算精度问题

js 小数点计算精度问题

时间:2022-12-05 17:57:36浏览次数:38  
标签:计算精度 r1 r2 arg1 arg2 小数点 js toString datevalue

/* 由于很多时候都会设计到浮点小数的算法,

 * 在JS 中只用普通的parseFlost之类的进信封数据类型转换会使数据失去精度  * 因此采用先转整数再计算的方式  * */ //浮点数相加  
function dcmAdd(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 (accMul(arg1,m)+accMul(arg2,m))/m;
}
 

//浮点数相减  

/*  * 说明同上面的加法  * */
function dcmSub(arg1,arg2){ 
     return dcmAdd(arg1,-arg2);
}
  //浮点数取余数 /*  * 跟据实际中的案例很容易丧失精度,通常做法是同时扩大10000倍,但考虑  * 跟前有关因此还是采用先转整数再计算  * */
function  dcmYu(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 (accMul(arg1,m)%accMul(arg2,m))/m;
}

 

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

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

 

/* 乘法函数,用来得到精确的乘法结果 说明: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)
}

 

// 转化成小数, 原函数toDecimal(datavalue)存在的精度问题,因涉及过多屏蔽。
function toDecimal(datevalue){
if(datevalue.indexOf('%') != -1){
datevalue = datevalue.replace(/%/g,'');
       if(datevalue.indexOf(',') != -1) {
       datevalue = datevalue.replace(/,/g,'');
       }      
       // 除100精度在原有基础上增加2位。
var decimal = (datevalue.indexOf('.') == -1) ? 0 : (datevalue.length - datevalue.indexOf('.') - 1);
       datevalue = accDiv(datevalue, 100).toFixed(decimal + 2);
//     alert("toDecimal: " + datevalue);
    } else {
if(datevalue.indexOf(',') != -1){
       datevalue = datevalue.replace(/,/g,'');
       }
    }
    return datevalue;
}
 
// 将小数转换为百分数。
function toPercentFormat(datevalue) {
var aa = accMul(datevalue, 100);
return "" + aa + "%";  
}

 

 

标签:计算精度,r1,r2,arg1,arg2,小数点,js,toString,datevalue
From: https://www.cnblogs.com/zt11402/p/16952996.html

相关文章

  • webpack.config.js文件配置选项
    //引入一个包constpath=require("path");//webpack里所有的配置信息module.exports={//entry指定入口文件"entry":"./src/index.ts",//output指......
  • tsconfig.json文件配置选项
    {//include用来指定哪些ts文件需要被编译"include":[//src目录下的所有ts文件//**任意目录//*任意文件"./src/*......
  • 中国地图json下载
    https://geojson.cn/https://datav.aliyun.com/portal/school/atlas/area_selector......
  • Threejs:渲染第一个场景
     导入方式1import*asTHREEfrom"three"; //设置场景constscene=newTHREE.Scene(); //初始化渲染器constrenderer=newTHREE.WebGLRenderer();......
  • js apply()用法详解
              参考:https://blog.csdn.net/weixin_43877799/article/details/120282509......
  • 前端知识之JS(javascirpt)
    目录JS简介JS基础1.注释语法2.引入JS的做种方式3.结束符号变量与常量基本数据类型1.数字类型(Number)2.字符类型(string)3.布尔类型(Boolean)4.null和underfined5.对象(obj......
  • js完美转换阿拉伯数字为数字繁写
    //阿拉伯数字转换为简写汉字functionArabia_To_SimplifiedChinese(Num){  for(vari=Num.length-1;i>=0;i--){    Num=Num.replace(",",""......
  • 用NetCore + ReactJS 实现一个前后端分离的网站 (5) 日志 - log4net & AOP切面编程
    用NetCore+ReactJS实现一个前后端分离的网站(5)日志-log4net&AOP切面编程1.前言日志始终是跟踪与调试程序的最佳手段,因为调试难以溯及既往,而日志则能忠实地记......
  • JS获取数组中元素的最大值
    方法1:Math.max.apply()Math.max()方法默认接收多个参数并返回最大值,而apply()方法接收一个数组,将数组中的每一项作为参数传给调用函数,搭配使用可以得到最大值。const......
  • node js的token生成与验证之“jsonwebtoken“
    ❤️在繁华中自律,在落魄中自愈❤️目录​​一、生成token​​​​二、验证token​​​​三、完整的jwt.js代码​​​​四、配合express使用token验证​​​​五、/api/login接......