js 四舍五入方法,重写js四舍五入方法

最近发现JS当中toFixed()方法存在一些问题,采用原生的Number对象的原型对象上的toFixed()方法时,规则并不是所谓的“四舍五入”或者是“四舍六入五成双”,所谓“四舍六入五成双”,在百度百科上给的解释是:也即“4舍6入5凑偶”这里“四”是指≤4 时舍去,"六"是指≥6时进上,"五"指的是根据5后面的数字来定,当5后有数时,舍5入1;当5后无有效数字时,需要分两种情况来讲:①5前为奇数,舍5入1;②5前为偶数,舍5不进。(0是最小的偶数) 。百度百科上涉及的几个例子在实际情况下确实成立,但不科学,并不能覆盖所有的情况。
为了实现四舍五入,我重写了一个四舍五入的方法,仅供参考。

function roundUtils2(srcValuef) {
	var iCount = 2;
	var srcValue = srcValuef;

	var zs = true;

	//判断是否是负数
	if ( srcValue < 0 )
	{
		srcValue = Math.abs(srcValue);
		zs = false;
	}

	var iB = Math.pow(10, iCount);

	//有时乘100结果也不精确
	var value1 = srcValue * iB;

	var anumber = new Array();
	var anumber1 = new Array();

	var fvalue = value1;
	var value2 = value1.toString();
	var idot = value2.indexOf(".");

	//如果是小数
	if ( idot != -1 )
	{
		anumber = srcValue.toString().split(".");

		//如果是科学计数法结果
		if ( anumber[1].indexOf("e") != -1 )
		{
			return Math.round(value1) / iB;
		}

		anumber1 = value2.split(".");
		
		if ( anumber[1].length <= iCount )
		{
			return parseFloat(srcValuef,10);
		} 

		var fvalue3 = parseInt(anumber[1].substring(iCount,iCount+1),10);
		
		if ( fvalue3 >= 5 )
		{
			fvalue = parseInt(anumber1[0],10) + 1;
		} 
		else 
		{
			//对于传入的形如111.834999999998 的处理(传入的计算结果就是错误的,应为111.835)
			if ( fvalue3 == 4 && anumber[1].length > 10 && parseInt(anumber[1].substring(iCount+1,iCount+2),10) == 9 )
			{
				fvalue = parseInt(anumber1[0],10) + 1;
			} 
			else 
			{
				fvalue = parseInt(anumber1[0],10);
			}
		}
	}
	//如果是负数就用0减四舍五入的绝对值
	if ( zs )
	{
		return fvalue / iB;
	} 
	else 
	{
		return 0 - fvalue / iB;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值