JavaScript:小数点以下の桁数に丸めますが、余分なゼロは削除します


85

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

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

注:.toPrecision私が望むものではありません。小数点以下の数値のみを指定したい。
注2:.toPrecision(1)小数点以下のデータが実際にある数値は高精度を保つ必要があるため、そのままでは使用できません。理想的には、必要な数の小数点以下の桁数(最大15)があります。


.toFixedは文字列を返すため、数値を介してラウンドトリップしてから文字列に戻すだけで、末尾のゼロなしで再変換されます。
ニール

@ネイサン:明確にするためだけに。toFixed()で取得した文字列の末尾のゼロを削除しますか?
Jiri Kriz 2011

回答:


141
>>> parseFloat(0.9999999.toFixed(4));
1
>>> parseFloat(0.0009999999.toFixed(4));
0.001
>>> parseFloat(0.0000009999999.toFixed(4));
0

4
負の数を扱うときは、括弧で囲むことを忘れないでください。演算子の優先順位による-2.34.toFixed(1)戻り値。-2.3
КонстантинВан

1
単項+演算子の使用は、parseFloat関数よりも高速である必要があります。+number.toFixed(13)この式を使用して、1.0000000000000045のようにJavaScript番号の不正確さを取り除くこともできます。
ygoe


19

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

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

6
本当に質問に答えたのはあなただけです。ありがとう!
ムゲン

4
これにより、ラウンド数にドットが
残り

5
@pckillドットを使用したくない場合は、正規表現に含めることができます(...replace(/\.?0+$/, "");)。
ザックスノー

これは0と-0で失敗します。これ0は、が空の文字列""-0なり-、がになるためです。どちらも予期されていません(推測では)。@ zach-提案された解決策も0と-0で失敗します。
robocat 2015年

@ Mugen、Gusの答えの問題は何でしたか?
トリシス2015

9

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


1
私が指摘したいと思いますが、+(n.toFixed(...))はparseFloatよりもはるかに効率的です。理由はわかりませんが、ChromeのNumberよりも効率的です。
ドミノ

8

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

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

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

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

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


@robocat簡単なチェックをしました。+(4.1).toFixed(4)ある4.1クローム60
КонстантинВан

わかりません。この回答が反対票を投じられた理由は何でしたか?
КонстантинВан

@Kあなたは正しかったので、前のコメントを削除して回答に追加しました(単項+を正しく使用するのではなく、lhsに文字列を含む中置+を使用していたと思います。通常はもっと注意します!乾杯)
robocat

この回答は、NaN、Infinity、-Infinity、3e30、および0でも機能します。他の回答は、一部のコーナーケースで失敗します。
robocat 2017

(4).toFixed(2)-> Chrome 60.0.3112.113の「4.00」
Daniel Que

1

これらのどれも、質問のタイトルに基づいて私が探していたものを実際に私に与えませんでした。たとえば、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

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


失敗します5e30(番号をに変更します5e3)。コーナーケースは悪魔的です!
robocat 2017

0

精度を維持し、ゼロを取り除くより良い方法があります。これは入力番号を受け取り、キャストの魔法によって末尾のゼロを取り除きます。冥王星に衛星を配置しない場合は、16が精度の限界であることがわかりました。これはかなり良いことです。

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

このtoFixed()メソッドnumber、固定小数点表記を使用してフォーマットし、を返しますstring

ハーフアップ丸め戦略を適用します。

(0.124).toFixed(2); // returns 0.12
(0.125).toFixed(2); // returns 0.13

あなたが説明したように、それは確かに時々(潜在的に不必要な)後続ゼロをもたらすでしょう。

(0.001).toFixed(2); // returns 0.00

これらの後続ゼロを削除したくない場合があります。基本的には、それをに戻すことができますnumber。これを行うには多くの方法があります。

+(0.001).toFixed(2); // the shortest

文字列を数値に変換するさまざまな方法の概要については、この質問を確認しください。いくつかの優れた回答があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.