js运算精度问题

news/2024/7/19 13:41:57 标签: 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 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){}

      r1=Number(arg1.toString().replace(".",""));

      r2=Number(arg2.toString().replace(".",""));
      return (r1/r2)*Math.pow(10,t2-t1);
}

原文路径:https://www.cnblogs.com/thelongmarch/p/9321748.html


http://www.niftyadmin.cn/n/874536.html

相关文章

python入坑指南_python入坑指南

大家好,我是Ez。今天我要给大家介绍一下python的故事以及选择它的理由。1.python是什么?大家谈恋爱也会问清七大姑八大姨,那么选择一个软件了解他是什么东西也不足为过了。Python是著名的“龟叔”Guido van Rossum在1989年圣诞节期间,为了打发…

k8s探针检测php,Kubernetes-7:Pod健康检查原理-探针(就绪检测、存活检测)

搜索热词探针-就绪探测、存活探测探针是由kubelet对容器执行的定期诊断,要执行诊断,kubelet调用由容器实现的Handler,有三种类型的处理程序:ExecActive:在容器内执行指定命令,若命令退出时返回码为0&#x…

php array_slice 函数,PHP中array_slice函数用法实例详解

本文详细介绍了array_slice函数的详细用法以及一些常用的array_slice实例程序,分享给大家供大家参考。具体分析如下:array_slice() 函数在数组中根据条件取出一段值,并返回.注释:如果数组有字符串键,所返回的数组将保留键名,参见例子 4.语法:array_slice(array,offs…

js获取url中参数

function get_url_cs() {var url location.search;//获取用户参数var request new Object()if (url.indexOf(?) ! -1) {var str url.substr(1)let strs str.split(&)for (var i 0; i < strs.length; i) {request[strs[i].split()[0]] strs[i].split()[1]}}consol…

php 多规格设置,规格模式(Specification)

3.8.1. 目的构建一个清晰的业务规则规范&#xff0c;其中每条规则都能被针对性地检查。每个规范类中都有一个称为isSatisfiedBy的方法&#xff0c;方法判断给定的规则是否满足规范从而返回 true 或 false。3.8.2. 例子3.8.3. UML Diagram3.8.4. Code你可以在 GitHub 中找到这段…

JS生成随机字符串的多种方法

<script language"javascript"> function randomString(len) {len len || 32;var $chars ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678; /****默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1****/var maxPos $chars.length;var pwd ;for (i 0; i &l…

python饮料购买_python - 饮料机,if elif与列表法

import timeimport oso1 "超火"o2 "火"o3 "温"o4 "凉"o5 "冰"while 1:ios.system("cls")input("请投币或刷卡")while 1:try:bint(input("请选择饮料:\n1.超火\n2.火\n3.温\n4.凉\n5.冰\n0.退…

c# 小票打印机打条形码_1块钱得真人语音版小票机?

快麦打印机早在4月份便推出了DP358系列云小票机&#xff0c;作为快麦首款云小票机&#xff0c;DP358通过接入网络并有快麦自主研发的快麦云&#xff0c;当接到外卖平台订单时&#xff0c;订单在云端排队打印。多款不同机型&#xff0c;满足不同用户需求DP158(WIFI来单滴滴声手动…