実生活の要求ではなく、関心から: JavaScript で 2 つの数値の指数を減算することは何とか可能ですか? JavaScriptでは正しい結果を表現できますが、 1e+29 * 1e-3
(または)の結果は1e+29 / 1e+3
不正確な数値になるためです。9.999999999999999e+25
1e+26
3 に答える
0
よりクリーンな方法が必要ですが、1つのオプションは、数値を文字列に変換し、それを操作してから、数値に戻すことです。
function exp_add(num,exp) {
var split = num.toExponential().split('e');
var exponent = parseInt(split[1],10);
exponent += exp;
return parseFloat(split[0] + "e" + exponent);
}
jsFiddleでの作業例。
于 2013-02-23T01:06:16.557 に答える
0
を使用できますがMath.log(1e29)/Math.LN10
、結果は になります28.999999999999993
。ベース 2 は、これらの数値に対して不正確です。したがって、最後の手段はNumber.prototype.toString
であり、正しく生成されるのは"1e29"
です。今それをどのように使用できますか?
function toExp(num) {
return num.toExponential().split("e").map(Number);
// num.toString() only works for num <= 1e-6 and num >= 1e21
}
function fromExp(exp) {
return exp[0] * Math.pow(10, exp[1]);
// or: parseFloat(exp[0]+"e"+exp[1]);
}
function expMultiply(a, b) {
return [ a[0]*b[0], a[1]+b[1] ];
}
function expDivide(a, b) {
return [ a[0]/b[0], a[1]-b[1] ];
}
> fromExp(expMultiply(toExp(1e29), toExp(1e-3)))
1e+26
> fromExp(expDivide(toExp(1e29), toExp(1e3)))
1e+26
于 2013-02-23T01:13:19.963 に答える
0
これは、特に一方の数値が他方の数値よりもはるかに小さい場合に、浮動小数点除算の結果として自然に表示されます。ただし、数値の基数が同じ場合は、指数だけを保存する必要があります。それ以外の場合は、対数を使用できます。
( Math.log(1e29) + Math.log(1e-3) ) / Math.LN10
> 25.999999999999993
不正確さを処理し、基数 10 で結果を取得するために、その結果を小数点以下の数桁に丸めることができます。
于 2013-02-23T01:16:30.243 に答える