JS 浮点数运算精度问题

作者: jaclon 分类: JS 发布时间: 2013-01-07 19:27 ė 6没有评论

今天在做财务计算的时候发现两个浮点算相加出现如下情况

t = parseFloat(18888.22) + parseFloat(988.22);
document.write(t);
//outout: 19876.440000000002 

这个应该是JS浮点运算的一个Bug吧,解决办法就是将浮点数放大N倍作整数运算后再除N,这样就能得到精确的结果;下面是网上的一些解决方法

//浮点数相加
function accAdd(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;这样还是有问题浮点数乘的问题在这里会发生
                return (arg1.mul(m) +arg2.mul(m))/m;
	}
//浮点数相减
	function accSubtr(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);
                return ((arg1.mul(m) - arg2.mul(m))/m).toFixed(n);
	}
//浮点数相乘
	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);
	}
//浮点数除法
	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);
		}
	}
//给Number类型增加相应方法,方便调用
	Number.prototype.add = function(arg) {
		return accAdd(this, arg);
	}
	Number.prototype.subtr = function(arg) {
		return accSubtr(this, arg);
	}
	Number.prototype.mul = function(arg) {
		return accMul(this, arg);
	}
	Number.prototype.div = function(arg) {
		return accDiv(this, arg);
	}
        var r1 = 18888.22,r2 = 988.2;
	document.write(r1.add(r2));   //output: 19876.42
	document.write(r1.subtr(r2)); //output: 17900.02
	document.write(r2.mul(2.2));  //output: 2174.04
	document.write(r2.div(0.02)); //output: 49410

本文出自 肥蕉博客@IT技术,热门话题,生活随笔,美图欣赏,转载时请注明出处及相应链接。

本文永久链接: http://www.bananawolf.com/html/2013/01/891.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*

Ɣ回顶部