2016-11-29 80 views
2

我正在尝试编写一个函数,该函数在将数值乘以10的负数幂时使用数组和split()方法输出正确的结果。例如,以下表达式可以得到正确的结果:1x10^-2 = 0.011x10^-4 = 0.0001使用数组进行负指数的基本计算

问题是当数的长度是优于指数值(请注意,我的代码把num作为字符串到它在阵列分割如图代码波纹管:

//var num is treated as a string to be splited inside get_results() function 
//exponent is a number 
//Try different values for exponent and different lengths for num to reproduce the problem 
//for example var num = 1234 and var exponent = 2 will output 1.234 instead of 12.34 

var num = '1'; 
var sign = '-'; 
var exponent = 2; 
var op = 'x10^'+sign+exponent; 

var re = get_result(num); 

console.log(num+op +' = '+ re); 


function get_result(thisNum) { 
    if (sign == '-') { 
    var arr = []; 
    var splitNum = thisNum.split(''); 
    for (var i = 0; i <= exponent-splitNum.length; i++) { 
     arr.push('0'); 
    } 
    for (var j = 0; j < splitNum.length; j++) { 
     arr.push(splitNum[j]); 
    } 
    if (exponent > 0) { 
     arr.splice(1, 0, '.'); 
    } 
    arr.join(''); 
    } 
    return arr.join(''); 
} 

演示这里:https://jsfiddle.net/Hal_9100/c7nobmnj/

我尝试了不同的方法来获得正确的结果,其长度和exponent的值不同,但是我没有找到合适的值,所以我没有想到其他任何东西。

你可以在这里看到我的最新尝试:https://jsfiddle.net/Hal_9100/vq1hrru5/

任何想法如何我可以解决这个问题?

PS:我知道由于JavaScript浮点转换造成的大部分舍入错误是非常无害的,可以使用toFixed(n)或使用专门的第三方库来修复,但我唯一的目标是在编写纯javascript功能。

回答

1

问题出在哪里你把小数点.

,而不是

arr.splice(1, 0, '.');

试试这个:

arr.splice(-exponent, 0, '.');

见琴:https://jsfiddle.net/free_soul/c7nobmnj/1/

+0

谢谢!我不知道为什么我没有想到它。现在它工作得很好! –

2

我不确定是否要继续使用数组方法解决问题,但似乎可以使用已存在的Math.pow()方法解决此问题。

function computeExponentExpression (test) { 
 
    var base; 
 
    var multiplier; 
 
    var exponent; 
 
    
 
    test.replace(/^(\d+)(x)(\d+)([^])([-]?\d+)$/, function() { 
 
\t base = parseInt(arguments[1], 10); 
 
    multiplier = parseInt(arguments[3], 10); 
 
    exponent = parseInt(arguments[5], 10); 
 
    return ''; 
 
    }); 
 
    
 
    console.log(base * Math.pow(multiplier, exponent)); 
 
} 
 

 
computeExponentExpression('1x10^-4'); 
 
computeExponentExpression('1x10^2'); 
 
computeExponentExpression('4x5^3');

+0

谢谢。尽管由于舍入错误,我不想使用Math.pow,但您向我展示了解析表达式字符串的一种非常有趣的方式。 –