问题描述
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>