前段时间在做k的项目时,有一些客户端的计算,用js写的。发现了js精度的一些问题,借鉴某位大牛的一句话:“内事不决问百度,外事不决问google”的经典名言,上网淘了下相关资料,总结了下,以供参考:
1、js精度问题产生的根源:
这两个网址上洋洋洒洒说了一大堆,归根结底就是类型的精度问题导致,js的number类型按照ECMA的JavaScript标准,它的Number类型就是IEEE 754的双精度数值,相当于java的double类型。
详细的内容可以参考:
http://forum.eaw.com.cn/thread/10/1
http://blog.csdn.net/xiaocon/archive/2005/09/03/470709.aspx
2、js精度问题的解决方案:
1)由于js对于整数计算是没有误差的,可以先转化为整数进行计算
MathUtil.js
//浮点数相加
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 (dcmMul(arg1,m)+dcmMul(arg2,m))/m;
}
//浮点数相减
function dcmSub(arg1,arg2){
return dcmAdd(arg1,-arg2);
}
//浮点数相乘
function dcmMul(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 dcmDiv(arg1,arg2){
return dcmMul(arg1,1/arg2);
}
Number.prototype.add = function (arg){
return dcmAdd(this, arg);
}
Number.prototype.sub = function (arg){
return dcmSub(this, arg);
}
Number.prototype.mul = function (arg){
return dcmMul(this, arg);
}
Number.prototype.div = function (arg){
return dcmDiv(this, arg);
}
2)模拟服务端bigdecimal的实现写一个js客户端的bigdecimal算法
自己写一套客户端的bigdecimal算法或者参考现成的bigdecimal实现
参考网址:http://stz-ida.de/html/oss/js_bigdecimal.html.en
3)利用ajax提交到后台进行计算
4)总结:
1、尽量不要用JS做复杂的运算,特别是浮点数的运算。
2、如果一定要进行浮点数的运算的话,先将浮点数转化为整形,再运算
相关推荐
JS精度问题,解决了JS加减乘除时候精度错误问题,就是后面带有很多0的问题
decimal解决js精度问题的js文件
在JavaScript编程语言中,计算精度问题是一个...如果压缩包中的"js-float-accuracy-master"库提供了实用的解决方案,那么它可能包含了一些优化的算法或工具,以帮助开发者更好地处理JavaScript中的浮点数计算精度问题。
NULL 博文链接:https://hejie084.iteye.com/blog/1260556
代码如下: /** * 加法运算,避免数据相加小数点后产生多位数和计算精度损失。 * * @param num1加数1 | num2加数2 */ function numAdd(num1, num2) { var baseNum, baseNum1, baseNum2; try { baseNum
为了解决上述提到的精度问题,可以通过自定义函数的方式来确保计算过程中的精度不会丢失。下面将详细介绍几种常用的方法,并提供具体的代码实现。 ##### 1. accDiv(arg1, arg2) —— 浮点数除法 此函数用于处理两...
在Javascript中parseFloat()方法会产生精度问题 代码如下: [removed] var a = “0.11”; var b = “0.2801”; var c = “1.002”; var sum1 = parseFloat(a) + parseFloat(b) + parseFloat(c); var sum2 = ...
除了Java之外,在JavaScript中也会遇到类似的精度问题。一种常见的解决方案是使用 `Math.round` 函数来四舍五入结果。 ```javascript function formatFloat(src, pos) { return Math.round(src * Math.pow(10, pos...
使用示例: math.config({ number:'BigNumber' }) let result=math.parser().eval(a+ "-" + b); //a,b是需要计算的值,中间是运算符
总的来说,JavaScript版`BigDecimal`类库为开发者提供了一种解决JavaScript精度问题的工具,使得在进行金融计算、科学计算或其他需要高精度计算的场合下,能够得到准确的结果。通过学习和应用这个库,开发者可以更好...
在JS中数值类型就只有number类型,没有int,float,double之分,number类型实际上存储的就是IEEE754标准的浮点数,计算规则也是。 在表达式计算前,先要按照标准将两个数转成浮点数。 IEEE 754规定: 1.32位的浮点数...
你是否因为JS端的小数计算的精度不足而发愁过呢 其实有个不错的资源可以利用。 引用附件的JS,就可以轻松搞定JS的计算问题了。 使用例 <!-- function //+ alert(new BigDecimal("10").add(new BigDecimal("3E+...
bigNumber.js解决js精度问题
在编写JavaScript代码进行数值计算时,经常会遇到四则运算中精度问题的困扰。这个问题尤其在涉及到浮点数运算时更为明显。浮点数在计算机中是以二进制形式存储的,由于某些小数无法精确用二进制表示,导致了运算结果...
JS 数字精度丢失的一些典型问题 JS 数字精度丢失的原因 解决方案(一个对象+一个函数) 一、JS数字精度丢失的一些典型问题 1. 两个简单的浮点数相加 0.1 + 0.2 != 0.3 // true 这真不是 Firebug 的问题,可以用...
类似于`bignumber.js`,`big.js`也是一个轻量级的库,专注于解决JavaScript的浮点数精度问题。它提供了一个Big类,用于创建和操作大数。与`bignumber.js`相比,`big.js`的API更简单,适合对性能要求较高或不需要...
js重写Number,解决精度问题
6. **跨平台兼容性**:需要注意的是,虽然JavaScript标准不直接支持半精度浮点数,但现代浏览器和Node.js环境中可以通过自定义函数实现。在不同平台和设备上测试代码,确保其兼容性和正确性。 7. **其他工具和库**...
封装mathjs的文件,用于解决js的精度问题导致的计算bug