使用数组对负指数进行基本计算
Using arrays to do basic calculations with negative exponent
我正在尝试编写一个函数,该函数在使用数组和 split()
方法将数字乘以 10 的负幂时输出正确的结果。例如,以下表达式得到正确的结果:1x10^-2 = 0.01
1x10^-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)
或使用专门的第三方库来修复,但我在这里的唯一目标是更好地编写纯 javascript 函数。
我不确定你是否想继续使用数组方法来解决问题,但看起来这可以通过使用已经存在的 Math.pow() 方法来解决。
function computeExponentExpression ( test ) {
var base;
var multiplier;
var exponent;
test.replace(/^(\d+)(x)(\d+)([^])([-]?\d+)$/, function() {
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');
问题是你把小数点推到哪里.
而不是
arr.splice(1, 0, '.');
试试这个:
arr.splice(-exponent, 0, '.');
我正在尝试编写一个函数,该函数在使用数组和 split()
方法将数字乘以 10 的负幂时输出正确的结果。例如,以下表达式得到正确的结果:1x10^-2 = 0.01
1x10^-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)
或使用专门的第三方库来修复,但我在这里的唯一目标是更好地编写纯 javascript 函数。
我不确定你是否想继续使用数组方法来解决问题,但看起来这可以通过使用已经存在的 Math.pow() 方法来解决。
function computeExponentExpression ( test ) {
var base;
var multiplier;
var exponent;
test.replace(/^(\d+)(x)(\d+)([^])([-]?\d+)$/, function() {
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');
问题是你把小数点推到哪里.
而不是
arr.splice(1, 0, '.');
试试这个:
arr.splice(-exponent, 0, '.');