easyui numberbox四舍五入精度问题解决

问题描述

numberbox,比如2位小数,输入-1后,会变成-0.99,输入-11就是-10.99,更神奇的事,我鼠标焦点放进去,焦点在离开,他就变-10.98,每做一次还会减0.01

原因说明

是因为要进行easyui numberbox要进行保留小数位,并且要进行四舍五入。
但是easyui numberbox框架四舍五入会有精度问题,具体可以度娘。
于是乎网上查找了一些帖子,
发现重写Number.prototype.toFixed可以实现正数的正常四舍五入,
但是会有填写负数,出现五舍六入等各种奇葩问题。
而非五舍六入,四舍六入无成双。。。等等问题。看的头大。。。

有问题的代码

重写toFixed方法,可以解决easyui numberbox四舍五入精度问题。

Number.prototype.toFixed = function (s) {  //在Number的原型上重写toFixed方法 
	var changenum = (parseInt(this * Math.pow(10, s) + 0.5) / Math.pow(10,s)).toString(); 
	var index = changenum.indexOf("."); 
	if (index < 0 && s > 0) { 
		changenum = changenum + "."; 
		for (i = 0; i < s; i++) { 
			changenum = changenum + "0"; 
		}
	} else { 
		index = changenum.length - index; 
		for (i = 0; i < (s - index) + 1; i++) { 
			changenum = changenum + "0"; 
		} 
	} 
	return changenum; 
}


解决方案

观察以上代码,只是针对正数进行了正确的处理,负数没有正确处理。
那么就修改以上代码,针对负数进行一些处理。

针对负数进行特别处理代码

Number.prototype.toFixed = function (s) {  //在Number的原型上重写toFixed方法
		var tempValue = this;
		var symbol = "";
		//针对负数 特殊处理
		if (tempValue < 0) {
			tempValue = -tempValue;
			symbol = "-";
		} 
		var changenum = (parseInt(tempValue * Math.pow(10, s) + 0.5) / Math.pow(10,s)).toString();
		var index = changenum.indexOf(".");
		
		if (index < 0 && s > 0) {
			changenum = changenum + ".";
			for (i = 0; i < s; i++) {
				changenum = changenum + "0";
			}
		} else {
			index = changenum.length - index;
			for (i = 0; i < (s - index) + 1; i++) {
				changenum = changenum + "0";
			}
		}
		return symbol+changenum;
	}
	

如何使用

datagrid可编辑editor里面用法如下:
只需添加precision(保留小数位位数)即可。

{title : 'XXXX',field : 'XXXX',width : '150px',align : 'center',
	editor : {
		type : 'numberbox',
		options : {
			required: true,
			//min:0,
			precision:2
			
		}
	}
},

或者如下:只需添加precision(保留小数位位数)即可。

<input class="easyui-numberbox" type="text" name="XXXX"
	id="XXX" data-options="prompt:'请填写数字...',precision:2" ></input>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值