我有以下虚拟测试脚本:
函数测试(){变量x=0.1*0.2;document.write(x);}测试();
这将打印结果0.020000000000000004,而它应该只打印0.02(如果您使用计算器)。据我所知,这是由于浮点乘法精度的错误。
有没有人有一个好的解决方案,在这种情况下,我得到了正确的结果0.02?我知道还有一些函数,比如toFixed或舍入,这是另一种可能,但我真的希望在不进行任何切割和舍入的情况下打印整个数字。我只是想知道你们中的一个人是否有一些好的、优雅的解决方案。
当然,否则我会舍入到10位数左右。
我有一个变通办法。例如,仅与10E^x相乘不适用于1.1。
function sum(a,b){
var tabA = (a + "").split(".");
var tabB = (b + "").split(".");
decA = tabA.length>1?tabA[1].length:0;
decB = tabB.length>1?tabB[1].length:0;
a = (tabA[0]+tabA[1])*1.0;
b = (tabB[0]+tabB[1])*1.0;
var diff = decA-decB;
if(diff >0){
//a has more decimals than b
b=b*Math.pow(10,diff);
return (a+b)/Math.pow(10,decA);
}else if (diff<0){
//a has more decimals than b
a=a*Math.pow(10,-diff);
return (a+b)/Math.pow(10,decB);
}else{
return (a+b)/Math.pow(10,decA);
}
}
可怕但有效:)
var times = function (a, b) {
return Math.round((a * b) * 100)/100;
};
---或---
var fpFix = function (n) {
return Math.round(n * 100)/100;
};
fpFix(0.1*0.2); // -> 0.02
---此外---
var fpArithmetic = function (op, x, y) {
var n = {
'*': x * y,
'-': x - y,
'+': x + y,
'/': x / y
}[op];
return Math.round(n * 100)/100;
};
---如中所示---
fpArithmetic('*', 0.1, 0.2);
// 0.02
fpArithmetic('+', 0.1, 0.2);
// 0.3
fpArithmetic('-', 0.1, 0.2);
// -0.1
fpArithmetic('/', 0.2, 0.1);
// 2
我发现BigNumber.js符合我的需求。
用于任意精度十进制和非十进制算术的JavaScript库。
它有很好的文档记录,作者对反馈非常认真。
同一作者还有其他两个类似的库:
Big.js
一个用于任意精度十进制运算的小型快速JavaScript库。bignumber.js的小妹妹。
和Decimal.js
JavaScript的任意精度Decimal类型。
下面是一些使用BigNumber的代码:
$(函数){var product=BigNumber(.1).times(.2);$('#product').text(product);var sum=BigNumber(.1).加号(.2);$('#sum').text(sum);});<script src=“https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js“></script><!-- 1.4.1不是当前版本,但适用于本示例。--><script src=“http://cdn.bootcss.com/bignumber.js/1.4.1/bignumber.min.js“></script>.1&次。2=<span id=“product”></span><br>.1加上。2=<span id=“sum”></span><br>