彼岸彩虹

一道道妙趣横生的编程题目,陪伴我的小船,驶向远方的彩虹

Number.prototype.toDecimal方法实现

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;
};


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/esir82/article/details/53991763
个人分类: JavaScript
所属专栏: JavaScript趣题
上一篇Befunge-93指令解释器的 JavaScript实现
下一篇JavaScript解析化学分子式
想对作者说点什么? 我来说一句

PB FTP实现方法

2011年01月14日 121KB 下载

易语言老板键实现方法

2008年09月24日 2KB 下载

tab页的实现方法 实现tab

2009年12月21日 452KB 下载

.dtree实现方法

2010年05月01日 246KB 下载

现金流量表的几种实现方法

2009年02月25日 373KB 下载

OrCAD与PADS的同步实现方法

2009年05月18日 640KB 下载

j2me 实现抛物线的两种方法

2010年01月19日 71KB 下载

java解析XML四种方案

2018年02月22日 55KB 下载

java数据结构算法实现

2008年12月09日 295KB 下载

FIR滤波器的FPGA实现方法

2011年03月16日 252KB 下载

没有更多推荐了,返回首页

关闭
关闭