关闭

Number.prototype.toDecimal方法实现

标签: javascript数字算法科学计数法方法扩展
338人阅读 评论(0) 收藏 举报
分类:

JavaScript中,数字可以被转化为字符串。例如(123.456).toString(),你将会得到字符串形式的"123.456"

某些时候,因为数字太大或太小,我们无法直接展示数字,就会用到一种“科学计数法”。

下面有一些科学计数法的简单例子:

100 == 1e+2

0.01 == 1e-2

12.34 == 1.234e+1

0.000456 == 4.56e-4

在这个计数法里面,e代表10e左边的是系数,e右边的是指数。

那么,如何编写一个将数字(包括科学计数法)转化为字符串的方法呢?

注意这里,比如1e+2,我们转化为字符串时,期望得到完整的数字”100”,而不是”1e+2”。再比如说1e-2,我们转化后期望得到”0.01”,而不是”1e-2”,这就需要我们对它进行处理。

Number.prototype.toDecimal = function() {
	//先转化为字符串
    var str = this + "";
    var ePos = str.indexOf("e");
	//如果是科学计数法表示的
    if(ePos >= 0){
		//截取系数
        var coefficient = str.slice(0,ePos);
		//截取指数
        var exponent = str.slice(ePos+1);
        var signPos = exponent.indexOf("-");
		//如果指数为负
        if(signPos >= 0){
            var array = null;
			//系数是否有小数点
            var pointPos = coefficient.indexOf(".");
            if(pointPos < 0){
				//例如1e-1要得到"0.1"
				//那么得创建为3的数组来存储
				//new Array(1 + 1 + 1)
                array = new Array(coefficient.length + parseInt(exponent.slice(signPos+1)) + 1);
            }
            else{
				//例如1.1e-1要得到"0.11"
				//那么得创建为4的数组来存储
				//new Array(3 + 1)
                array = new Array(coefficient.length + parseInt(exponent.slice(signPos+1)));
            }
			//例如1.1e-3
			//=>[,,,,,]
			//=>[,,,,1,1]
            for(var i=coefficient.length-1,j=array.length-1;i>=0;i--,j--){
                var chr = coefficient.charAt(i);
                if(chr !== "."){
                    array[j] = chr;
                }
                else{
                    j += 1;
                }
            }
			//=>[0,0,0,0,1,1]
            for(i=j;i>=0;i--){
                array[i] = 0;
            }
			//=>[0,.,0,0,1,1]
            array[1] = ".";
			//=>"0.0011"
            return array.join("");
        }
        else{
            var result = "";
            var pointPos = coefficient.indexOf(".");
            var zeroNum = 0;
			//如果没有小数点
            if(pointPos < 0){
				//拼接指数个0
				//例如1e3
				//=>"1000"
				//要拼接3个0
                zeroNum = parseInt(exponent);
                result = coefficient;
            }
            else{
				//例如1.1e3
				//=>"1100"
				//要拼接3 - (3 - 1 - 1) = 2 个0
                zeroNum = parseInt(exponent) - (coefficient.length - 1 - pointPos);
                result = coefficient.charAt(0) + coefficient.slice(pointPos+1);
            }
			//拼接0
            while(zeroNum--){
                result += "0";
            }
            return result;
        }
    }
    return str;
};


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:43974次
    • 积分:1646
    • 等级:
    • 排名:千里之外
    • 原创:126篇
    • 转载:0篇
    • 译文:0篇
    • 评论:12条
    博客专栏
    文章分类
    最新评论