2016-11-29 34 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,但您向我展示瞭解析表達式字符串的一種非常有趣的方式。 –