web-dev-qa-db-ja.com

JavaScript:小数点以下の桁数に丸めますが、余分なゼロを取り除きます

シナリオは次のとおりです。_.9999999999999999_を取得する必要があるときに、_1.0_を取得しています。
小数点以下の精度を失う余裕があるので、.toFixed(15)を使用しています。

丸めは機能しますが、問題は_1.000000000000000_が与えられることです。
小数点以下の桁数に丸める方法はありますが、余分な空白を削除しますか?

注:_.toPrecision_は私が望むものではありません。小数点以下の数を指定するだけです。
注2:小数点の後に実際にデータがある数値の高精度を維持する必要があるため、.toPrecision(1)を使用することはできません。理想的には、必要な数だけ正確に小数点以下桁数がある(最大15)。

73
Nathan
>>> parseFloat(0.9999999.toFixed(4));
1
>>> parseFloat(0.0009999999.toFixed(4));
0.001
>>> parseFloat(0.0000009999999.toFixed(4));
0
131
Gus

はい、方法があります。 parseFloat()を使用します。

parseFloat((1.005).toFixed(15)) //==> 1.005
parseFloat((1.000000000).toFixed(15)) //==> 1

こちらのライブ例をご覧ください: http://jsfiddle.net/nayish/7JBJw/

32
Nayish

私が理解しているように、toFixed()を介して取得した文字列の末尾のゼロを削除する必要があります。これは純粋な文字列操作です。

var x = 1.1230000;
var y = x.toFixed(15).replace(/0+$/, "");  // ==> 1.123
18
Jiri Kriz

Number(n.toFixed(15)) or +(n.toFixed(15))は、15桁の10進数文字列を数値に変換し、末尾のゼロを削除します。

9
kennebec

戻り値を数値にキャストすると、末尾のゼロは削除されます。これはparseFloat()よりも冗長ではありません。

_+(4.55555).toFixed(2);
//-> 4.56

+(4).toFixed(2);
//-> 4
_

これは 単項+演算子 を使用するため、文字列操作の一部としてこれを使用する場合は、前に中置+が必要です:var n=0.9999999999999999; console.log('output ' + +n.toFixed(2));。参考までに、文字列の前にある単項+は、数値に変換します。 MDNから:Unary + can:

整数と浮動小数点の文字列表現、および文字列以外の値true、false、およびnullを変換します。 10進数と16進数(「0x」で始まる)形式の両方の整数がサポートされています。負の数がサポートされています(16進数ではありません)。特定の値を解析できない場合、NaNと評価されます。

6
C. J.

Mmmm、クロスブラウザーについても少し異なる答え:

function round(x, n) {
    return Math.round(x * Math.pow(10, n)) / Math.pow(10, n)
}
4
super

これらのどれも、質問のタイトルに基づいて私が探していたものを実際に取得しませんでした。たとえば、5.00は5で、5.10は5.1でした。私の解決策は次のとおりでした:

num.toFixed(places).replace(/\.?0+$/, '')

'5.00'.replace(/\.?0+$/, '') // 5
'5.10'.replace(/\.?0+$/, '') // 5.1
'5.0000001'.replace(/\.?0+$/, '') // 5.0000001
'5.0001000'.replace(/\.?0+$/, '') // 5.0001

注:正規表現は、places > 0

追伸 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed

1
Jenna Zeigen

精度を保ち、ゼロを取り除くより良い方法があります。これは入力番号を取り、キャストの魔法を通して、後続のゼロを引き出します。 16が精度の限界であることがわかりました。これは、pl王星に衛星を置かない場合はかなり良いです。

function convertToFixed(inputnum)
{

      var mynum = inputnum.toPrecision(16);
//If you have a string already ignore this first line and change mynum.toString to the inputnum

      var mynumstr = mynum.toString();
    return parseFloat(mynumstr);
    }
    alert(convertToFixed(6.6/6));
0
Kevrone