一、背景简介
近来接手一个金融相关项目,涉及到大数据的计算,页面上出现科学计数法问题,从而引发的探索。
二、科学计数法简介
关于科学计数法详细介绍请自行百度,这里只介绍结构
eg. 6.23E26 (E不区分大小写)
其中 6.23 为小数位部分 ,E为科学计数法声明,26指10的幂指数。
三、JS中科学计数法探索
1、JS中科学计数法出现的时机
JavaScript在以下情景会自动将数值转换为科学计数法:
1)小数点前的数字多于21位。
2)小数点后的零多于5个。
2、解决办法
因大多数情况下,需要我们向用户所展示的完整数据并不能出现科学计数法,关于科学计数法转换,网上有许多解决办法,然而在我的项目中,并不能解决所有的问题。
科学计数法的表示大多有以下两种:
eg. 6.78E27 6.78E+27
1)对于第一种(6.78E27)
这种比较容易解决,在项目中,我基本使用
parseFloat("6.78E27").toString();
即可解决问题
2)对于第二种(6.78E+27)
对于带符号的科学计数法,博主寻遍网络没有找到什么特别满意的方法,于是自己写了一个方法
function convertNum(amount) {
// 判断是否科学计数法,是则进行转换
var num = 0;
if((amount.indexOf('E') != -1) || (amount.indexOf('e') != -1)) {
(amount.indexOf('E') != -1)? num = amount.indexOf('E'):num = amount.indexOf('e');
var decimal = amount.substr(0, num);
// devide the sentice efficial number
var decArr = decimal.split('.',2);
// 10的指数部分
var power = amount.substr(num+1,amount.length);
// symbol + -
var symbol = power.substr(0,1);
power = power.substr(1, power.length);
power = power * 1.0;
if('+' == symbol) {
// 0 的数量是 power - decArr[1]
power = power - decArr[1].length;
// the return data
var result = [];
while(power > 0) {
result.unshift(0);
power -= 1;
}
result.unshift(decArr[1] * 1.0);
result.unshift(decArr[0] * 1.0);
result.join("");
result = result + '';
amount = result.replace(/,/g,'');
}
}
return amount;
}
*该方法只是一个初稿,适合金融项目,思考过后完善了一下方法(请原谅无厘头的注释..)
function convertNum(amount) {
// 判断是否科学计数法,是则进行转换
var num = 0;
var result = [];
amount = new String(amount);
if((amount.indexOf('E') != -1) || (amount.indexOf('e') != -1)) {
(amount.indexOf('E') != -1)? num = amount.indexOf('E'):num = amount.indexOf('e');
var decimal = amount.substr(0, num);
// devide the sentice efficial number
var decArr = decimal.split('.',2);
// total 10 power
var power = amount.substr(num+1,amount.length);
// symbol + -
var symbol = power.substr(0,1);
power = power.substr(1, power.length);
power = power * 1.0;
if('+' == symbol) {
// the number of 0 is power - decArr[1]
power = power - decArr[1].length;
// the return data
while(power > 0) {
result.unshift(0);
power -= 1;
}
result.unshift(decArr[1] * 1.0);
result.unshift(decArr[0] * 1.0);
} else {
power = power - decArr[1].length;
var result = [0];
result.push('.');
while(power > 0) {
result.push(0);
power -= 1;
}
result.push(decArr);
}
}
result.join("");
result = result + '';
amount = result.replace(/,/g,'');
return amount;
}
四、总结
代码只是单纯的按照业务逻辑进行罗列的,有可改进的地方,欢迎大家提示,本人还是个菜,只是想总结一下遇到的问题。特别想把循环去掉,但一直没有找到办法,希望大家可以给出意见。