js 加减乘除计算的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js 加减乘除计算的问题相关的知识,希望对你有一定的参考价值。

我今天需要做个自定义公式的功能,就是可以选择参数,可以自行选择 + _ * / ( )
这些基本运算符
我在做有效性判断的时候,发现 /+ /- 甚至 ///这样的居然js全都给我算出数字来了
如 2/+2+4/-5 结果为0.199999999
还有 2//////////2 结果是2

请问这些是如何计算出来的?我实在很不解...
我快下班了,我会在明天给出满意答案 谢谢大家了

javascript中的运算时存在问题的,下面以除法为例,仅供参考:
javascript中的除法问题:
计算一下:
8.80 * 100 * 12 / 100
结果:105.60000000000002
38.80也会出现类似的问题。
精确度增加10倍:
8.80 * 1000 * 12 / 1000
结果:105.6
正常了。
16.40 * 1000000 * 6 / 1000000
结果也有问题
为了让js执行的更准确,在以后的js小数计算中直接将值扩大10000倍,再除以10000,就可以解决问题。
var num = 38.80;
var num2 = 13;
alert(num * 10000 * 12 / 10000);
被乘和除的这个数经过测试10000最合适,小了有些数字出问题,大了(1000000)有些数字也出问题。
参考技术A 转义字符只能转义比如“、‘、/这些属于特定的字符,并不能转义+ - * /
所以2/+2+4/-5 他会理解为2/(+2)+4/(-5) =0.2 至于0.1999999这个是显示的问题
2//////////2中 // 就表示注释,所以后面的////////2都被理解为注释,没有意义 因而结果为2本回答被提问者采纳

js乘法精度计算代码 求解释

//乘法函数,用来得到精确的乘法结果
//说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
//调用:accMul(arg1,arg2)
//返回值:arg1乘以arg2的精确结果
function accMul(arg1,arg2)

var m=0,s1=arg1.toString(),s2=arg2.toString();
trym+=s1.split(".")[1].lengthcatch(e)
trym+=s2.split(".")[1].lengthcatch(e)
return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m)

求解释两个try语句内代码含义
经过两个try语句后,m值不就是第二个代码的值了么。 这样最后计算就可能出错啊,但实际运行这是个正确的方法,不懂,求解释!
我自己想通了 ,, 通过第二个语句m值不是第二个小数的小数位数,而是变为两个小说的位数之和。

try只是捕获错误,被try包围的语句如果出错了也会继续执行下面的。


这里try里面的语句是获取小数位的长度,假如s1是整数的话s1.split(".")[1].length这句会出错。所以忽略这句,继续执行下面的。


如果不用try的话可以改成下面的

function accMul(arg1, arg2) 
    var m = 0,
        s1 = arg1.toString(),
        s2 = arg2.toString(),
        t;

    t = s1.split(".");
    // 判断有没有小数位,避免出错
    if (t[1]) 
        m += t[1].length
    

    t = s2.split(".");
    if (t[1]) 
        m += t[1].length
    

    return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m)

追问

谢谢你。 百度给我了个推荐答案,就没注意其它的。其实该选你为答案的

追答

那赞一个呗,o(∩_∩)o 哈哈

追问

你给我解释清楚了try catch。谢谢!

参考技术A

js含有小数的计算都会有丢失精度的问题


实际上解决的办法就是

把小数转化为整数计算 并同时记住扩大的倍数

最后把结果缩小这个倍数 得到不丢失精度的结果

try catch 就是捕获异常 如果没有捕获肯定会报错

也就是你现在按流程所设想的

但是catch(e)  是捕获了异常 但是里面并没有任何操作

也就是 越过去了 忽略掉

// 这句就是像将小数点去掉 变成整数 如果没有小数点那就没有变化
// 然后计算之后 缩小 10的m次方倍  也就是之前扩大了的倍数
Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m)

追问

原理我明白。你回答的和我问的不是一回事。 不过还是谢谢你!

本回答被提问者和网友采纳
参考技术B 注意 第二个try 中用的是m+=而不是 m=.所以实际上 执行两个try 之后m的值是两个浮点数小数位数的和,例arg1=2.3 arg2=3.456 那么就是4,也就是说精确到小数后为,但是实际计算后只能小数只有3位 所以就显示到后三位了追问

谢谢你。百度怎么给了我个推荐答案啊,我就把它选了,没看见后面的回答。。 不然在你和上面这个哥们选一个了。 谢谢你能仔细看我代码!

以上是关于js 加减乘除计算的问题的主要内容,如果未能解决你的问题,请参考以下文章

解决JS浮点数(小数)计算加减乘除的BUG

js乘法精度计算代码 求解释

完美的js实现的计算器,带加减乘除号

JS实现精确加减乘除

数值金额计算js封装--包含加减乘除四个方法,能确保浮点数运算不丢失精度

解决JS浮点数(小数)计算加减乘除的BUG