2016-11-29 5 views
2

Я пытаюсь написать функцию, которая выводит правильный результат при умножении числа на отрицательную мощность десяти с использованием массивов и 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/

Я пробовал различные подходы, чтобы получить правильные результаты с различными num длиной и exponent значения, но я ничего не пришел с обработанным и я пришел к тому, что я не могу думать ни о чем друг.

Вы можете увидеть мою последнюю попытку здесь: https://jsfiddle.net/Hal_9100/vq1hrru5/

Любая идея, как я мог решить эту проблему?

PS: Я знаю, что большинство ошибок округления из-за преобразования с плавающей запятой javascript довольно безвредны и могут быть исправлены с использованием toFixed(n) или с использованием специализированных сторонних librairies, но моя единственная цель здесь - лучше писать чистый 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 из-за ошибок округления, вы показали мне очень интересный способ разбора строки выражения. –