問題:結果を実行すると、3 ではなくlog1000
結果が得られます。log1000 = 2.9999999999999996
eval()
結果の精度に影響を与えることなく、JavaScript 関数のこの丸め誤差を除去しようとしました。数値の「右端」がイプシロンよりも大きいかどうかをテストする形式の番号付け関数FormatNumber(strnum)
に入れます(イプシロンの値がCのように1e-9であると仮定します)CheckEpsilon(strnum)
function FormatNumber(strnum) {
// asf - number format: automatic(0), scientific(1) or fixed(2) notation
// decimal - number of decimal places(0-15)
// First we must check if the right tail is bigger than epsilon
strnum = CheckEpsilon(strnum);
// And then we format the number
var x = parseFloat(strnum);
switch(asf) {
case 0: // auto
strnum = x.toPrecision();
break;
case 1: // sci
strnum = x.toExponential(decimal);
break;
case 2: // fix
strnum = x.toFixed(decimal);
break;
}
return strnum;
}
function CheckEpsilon(strnum) {
// EPSILON - Difference between 1 and the least value greater than 1 that is representable.
var epsilon = 1e-8;
var x = parseFloat(strnum);
var expnum = x.toExponential(17);
// Last 10 numbers before the exponent (9 if the number is negative)
// we turn in to a new decimal number ...
var y = parseFloat("0." + expnum.slice(9,19));
// and then we compare it to epsilon (1e-8)
// If y (or 1-y) is smaller than epsilon we round strnum
if (y<epsilon || (1-y)<epsilon) {
strnum = x.toExponential(10);
}
//and if it isn't, strnum is returned as normal
return strnum;
}
関数の実用的なショーケースに興味がある場合は、私が作成した電卓を参照してください (JavaScript で作成されているため、コードを簡単に確認できます)。リンクはhttp://www.periodni.com/calculator.htmlです。
これは私が行った方法ですが、私の実際の質問は次のとおりです。これを行うより良い方法を知っている人はいますか?