关于JScript的四舍五入
时间:2006-08-17 来源:xmankan
今天有同事把我以前写的一个JScript四舍五入函数拿过来用的时候发现了N多Bugs,于是让我重新写一下,关于此事的主题就成了此文。因为太初级了,但是水平就这点了。
我想要把JScript中关于四舍五入的话题说一遍得花很长时间。所以只讨论其中的一小部分。网上的函数有很多,但是我要先把自己的未审核的代码贴出来,希望能得到一点评论。特别需要注意的是,有时候传入roundNumber的参数num会是object对象,故没有indexOf方法,所以在处理前要用一下toString。
function addZero(num, digit)
{//添零函数,方便处理
for (i = 0; i < digit; i++)
{
num = num.concat("0");
}
return num;
} function roundNumber(num, digit)
{
//排除参数异常的可能
if (digit < 0)
{
digit = 0;
}
digit = parseInt(digit); //将object的num转换为string,否则不能对其调用indexOf方法。
num = num.toString(); //获得小数点的位置
var pos = num.indexOf('.');
if (pos == -1)
{
pos = num.length;
num = num + ".";
} //添零
num = addZero(num, digit);
if (parseInt(num.charAt(parseInt(pos) + parseInt(digit) + 1)) > 4)
{ //需要进位
//num = (parseFloat(num.substring(0, parseInt(pos) + parseInt(digit) + 1)) // + 1/Math.pow(10, digit)).toString(); num = (parseFloat(num) + 1/Math.pow(10, digit)).toString(); //进位可能导致小数点丢失或移动
pos = num.indexOf('.');
if (pos == -1)
{
pos = num.length;
num = num + ".";
}
num = addZero(num, digit);
}
num = num.substring(0, parseInt(pos) + parseInt(digit) + 1); if (digit == 0)
{//去掉末尾小数点
num = parseFloat(num);
}
return num;
} 这个函数还很脆弱,不容有一点压力的参数传入。但是它将对进位的处理转化为只处理单位,对整个数字的处理转化为对字符串的处理。其它网上的一些代码都用到了round(number)方法,我没有使用,但在第一次写的函数中用到了,如下: function roundNumber(num, digit)
{
var str = Math.round(num * Math.pow(10, digit)).toString();
var temp = str.substring(0, str.length - digit) + "." + str.substr(str.length - digit);
if (temp.lastIndexOf('\.') == temp.length - 1)
{
temp = temp.substring(0,temp.length - 1);
}
return temp;
} 这个函数对位数应该是有限制的,而且基本不能使用。 Following appended by Ken#2006-09-15 今天无意间发现了一个惊人的结果,与下句有关: num = (parseFloat(num.substring(0, parseInt(pos) + parseInt(digit) + 1)) + 1/Math.pow(10, digit)).toString(); 现以修改为 num = (parseFloat(num)) + 1/Math.pow(10, digit)).toString(); 具体原因稍候详述。 同时还有个JS的小数乘除法的问题,也许要讨论研究。会在下面链接有所反映: http://blog.chinaunix.net/u/22676/showart.php?id=166608 未完待续 水平有限,仅供个人参考。转载请注明出处和链接。
{//添零函数,方便处理
for (i = 0; i < digit; i++)
{
num = num.concat("0");
}
return num;
} function roundNumber(num, digit)
{
//排除参数异常的可能
if (digit < 0)
{
digit = 0;
}
digit = parseInt(digit); //将object的num转换为string,否则不能对其调用indexOf方法。
num = num.toString(); //获得小数点的位置
var pos = num.indexOf('.');
if (pos == -1)
{
pos = num.length;
num = num + ".";
} //添零
num = addZero(num, digit);
if (parseInt(num.charAt(parseInt(pos) + parseInt(digit) + 1)) > 4)
{ //需要进位
//num = (parseFloat(num.substring(0, parseInt(pos) + parseInt(digit) + 1)) // + 1/Math.pow(10, digit)).toString(); num = (parseFloat(num) + 1/Math.pow(10, digit)).toString(); //进位可能导致小数点丢失或移动
pos = num.indexOf('.');
if (pos == -1)
{
pos = num.length;
num = num + ".";
}
num = addZero(num, digit);
}
num = num.substring(0, parseInt(pos) + parseInt(digit) + 1); if (digit == 0)
{//去掉末尾小数点
num = parseFloat(num);
}
return num;
} 这个函数还很脆弱,不容有一点压力的参数传入。但是它将对进位的处理转化为只处理单位,对整个数字的处理转化为对字符串的处理。其它网上的一些代码都用到了round(number)方法,我没有使用,但在第一次写的函数中用到了,如下: function roundNumber(num, digit)
{
var str = Math.round(num * Math.pow(10, digit)).toString();
var temp = str.substring(0, str.length - digit) + "." + str.substr(str.length - digit);
if (temp.lastIndexOf('\.') == temp.length - 1)
{
temp = temp.substring(0,temp.length - 1);
}
return temp;
} 这个函数对位数应该是有限制的,而且基本不能使用。 Following appended by Ken#2006-09-15 今天无意间发现了一个惊人的结果,与下句有关: num = (parseFloat(num.substring(0, parseInt(pos) + parseInt(digit) + 1)) + 1/Math.pow(10, digit)).toString(); 现以修改为 num = (parseFloat(num)) + 1/Math.pow(10, digit)).toString(); 具体原因稍候详述。 同时还有个JS的小数乘除法的问题,也许要讨论研究。会在下面链接有所反映: http://blog.chinaunix.net/u/22676/showart.php?id=166608 未完待续 水平有限,仅供个人参考。转载请注明出处和链接。
相关阅读 更多 +