toFixed()とtoPrecision()の違いは?


124

私はJavaScriptに不慣れで、発見toFixed()toPrecision()たばかりで数値を丸めています。しかし、両者の違いがわかりません。

違いは何であるnumber.toFixed()とはnumber.toPrecision()

回答:


133

toFixed(n)n小数点の後の長さを提供します。全長をtoPrecision(x)提供しますx

w3schoolsでの参照:toFixedおよびtoPrecision

編集
私はしばらく前にw3schoolsが最適なソースではないことを学びましたが、kzhのええと、「熱狂的な」コメントが見られるまで、この答えを忘れていました。ここではMozillaのドキュメントセンターから追加レフリーあるためtoFixed()のためにtoPrecision()。幸い、私たち全員にとって、MDCとw3schoolsはこの場合、互いに同意します。

完全を期すため、これtoFixed()は同等でtoFixed(0)ありtoPrecision()、フォーマットせずに元の数値を返すだけであることを述べておきます。


11
2010年7月に投稿しましたが、w3foolsについては今年まで知りませんでした。愚か者はいくつかのことについては正しいが、学校のすべてが間違っているわけではない。この投稿を更新する必要があることを指摘していただきありがとうございます。少しでそれを行います。
ポップス

24
toPrecision(x)x全長を提供する」のではなく、指定された有効桁数にフォーマットします。たとえば、0.0000022.toPrecision(1)が返され0.000002ます。
アンディE

5
私はw3foolsにアクセスしたばかりで、まったく確信が持てませんでした。議論すら見ていません。私が見るのは、他の2つのサイトの広告だけです。
NiCkニューマン

2
「... toPrecision(x)x全長を提供します。」という文。必ずしも成立するとは限りません。カウンターの例:0.00001234.toPrecision(3)
djvg 2018年

59

前者は小数点以下の桁数が固定されているのに対し、後者は有効桁数が固定されていると思います。

Math.PI.toFixed(2); // "3.14"
Math.PI.toPrecision(2); // "3.1"

さらに、指定された精度よりも整数の桁数が多い場合toPrecisionは、科学的表記が生成されます。

(Math.PI * 10).toPrecision(2); // "31"
(Math.PI * 100).toPrecision(2); // "3.1e+2"

編集:ああ、そしてあなたがJavaScriptに不慣れな場合は、Douglas Crockford 著の「JavaScript:The Good Parts」という本を強くお勧めします。


14

例ははっきりと話します:

var A = 123.456789;

A.toFixed()      // 123
A.toFixed(0)     // 123
A.toFixed(1)     // 123.5
A.toFixed(2)     // 123.46
A.toFixed(3)     // 123.457
A.toFixed(4)     // 123.4568
A.toFixed(5)     // 123.45679
A.toFixed(6)     // 123.456789
A.toFixed(7)     // 123.4567890
A.toFixed(8)     // 123.45678900
A.toFixed(9)     // 123.456789000
A.toFixed(10)    // 123.4567890000
A.toFixed(11)    // 123.45678900000

A.toPrecision()      // 123.456789 
A.toPrecision(0)     // --- ERROR --- 
A.toPrecision(1)     // 1e+2
A.toPrecision(2)     // 1.2e+2
A.toPrecision(3)     // 123
A.toPrecision(4)     // 123.5
A.toPrecision(5)     // 123.46
A.toPrecision(6)     // 123.457
A.toPrecision(7)     // 123.4568
A.toPrecision(8)     // 123.45679
A.toPrecision(9)     // 123.456789
A.toPrecision(10)    // 123.4567890
A.toPrecision(11)    // 123.45678900

11

これは例で最もよく答えられると思います。

次のデータがあるとします。

var products = [
  {
    "title": "Really Nice Pen",
    "price": 150
  },
  {
    "title": "Golf Shirt",
    "price": 49.99
  },
  {
    "title": "My Car",
    "price": 1234.56
  }
]

これらの各商品をタイトルとフォーマットされた価格で表示したいとします。toPrecision最初に使ってみましょう:

document.write("The price of " + products[0].title + " is $" + products[0].price.toPrecision(5));

The price of Really Nice Pen is $150.00

見栄えが良いので、これは他の製品でも同様に機能すると思います:

document.write("The price of " + products[1].title + " is $" + products[2].price.toPrecision(5));
document.write("The price of " + products[2].title + " is $" + products[2].price.toPrecision(5));

The price of Golf Shirt is $49.990
The price of My Car is $1234.6

あまりよくない。これは、各製品の有効桁数を変更することで修正できますが、一連の製品を繰り返し処理する場合は注意が必要です。toFixed代わりに使用しましょう:

document.write("The price of " + products[0].title + " is $" + products[0].price.toFixed(2));
document.write("The price of " + products[1].title + " is $" + products[2].price.toFixed(2));
document.write("The price of " + products[2].title + " is $" + products[2].price.toFixed(2));

The price of Really Nice Pen is $150.00
The price of Golf Shirt is $49.99
The price of My Car is $1234.56

これにより、期待どおりの結果が得られます。関連する推測作業はなく、丸めもありません。



5

特定の状況下でtoPrecision()は、指数表記を返しますが、返しtoFixed()ません。


実際にtoExponential()は、別の機能です。
ポップス

4
@Lord Torgamus:私のJavascript:The Definitive Guideによると、精度の引数が数値の整数部分のすべての桁を含めるのに十分な大きさである場合、toPrecision(precision)は固定小数点表記を使用します。それ以外の場合は、指数表記が使用されます。
ロブスト

少なくとも一部のケースでは、これは正しくありません。私のFirefoxでは、を使用するとa = 999999999999999934464;a.toFixed(0)が返されます"1e+21"。おそらくより正確な答えは、toString()が返さない限り、toFixed()は指数表記を返さないということでしょう。
ポール2018

1

たとえば、変数aを次のように考えます:var a = 123.45 a.toPrecision(6)出力は123.450 a.toFixed(6)出力は123.450000のようになります//小数点以下6桁


0

toPrecision()toFixed()はどちらも、数値を出力する前にフォーマットするように設計された関数です。したがって、どちらもString値を返します。

例外が1つあります。負の数値リテラルでこれらの関数を使用すると、演算子の優先順位により、数値が返されます。これが意味することであるtoFixed()か、toPrecision()最初の文字列を返し、その後、-マイナス演算子は負の値として数値に文字列の背中を変換します。以下の例をご覧ください。

toPrecision()StringNumberオブジェクトを、有効数字に丸められた固定小数点または指数表記で返します。したがって、1の精度が必要であると指定した場合、最初の有効数字と10の累乗を示す科学表記、または有効数字が0未満の場合は小数点の前の0を返します。

const num1 = 123.4567;

// if no arguments are passed, it is similar to converting the Number to String
num1.toPrecision();   // returns "123.4567

// scientific notation is used when you pass precision count less than total
// number of digits left of the period
num1.toPrecision(2);  // returns "1.2e+2"

// last digit is rounded if precision is less than total significant digits
num1.toPrecision(4);  // returns "123.5"
num1.toPrecision(5);  // returns "123.46"

const largeNum = 456.789;
largeNum.toPrecision(2);  // returns "4.6e+2"

// trailing zeroes are added if precision is > total digits of the number or float
num1.toPrecision(9);  // returns "123.456700"

const num2 = 123;
num2.toPrecision(4);  // returns "123.0"

const num3 = 0.00123;
num3.toPrecision(4);  // returns "0.001230"
num3.toPrecision(5);  // returns "0.0012300"

// if the number is < 1, precision is by the significant digits
num3.toPrecision(1);  // returns "0.001"

toFixed()StringNumberオブジェクトを固定小数点表記で切り上げて返します。この関数は小数点の数のみを考慮します

const num1 = 123.4567;

// if no argument is passed, the fractions are removed
num1.toFixed();  // returns "123"

// specifying an argument means you the amount of numbers after the decimal point
num1.toFixed(1);  // returns "123.5"
num1.toFixed(3);  // returns "123.457"
num1.toFixed(5);  // returns "123.45670"
num1.toFixed(7);  // returns "123.4567000"

// trying to operator on number literals
2.34.toFixed(1);  // returns "2.3"
2.toFixed(1);     // returns SyntaxError
(2).toFixed(1);   // returns "2.0"
(2.34e+5).toFixed(1);  // returns "234000.0"

負の数値リテラルでこれらの関数を使用すると、演算子の優先順位が原因で、文字列ではなく数値が返されるという例外を前述しました。ここではいくつかの例を示します。

// Note: these are returning as Number
// toPrecision()
-123.45.toPrecision();  // returns -123.45
-123.45.toPrecision(2);  // returns -120
-123.45.toPrecision(4);  // returns -123.5
-2.34e+2.toPrecision(1);  // returns -200
-0.0456.toPrecision(1);  // returns -0.05
-0.0456.toPrecision(6);  // returns -0.0456

// toFixed()
-123.45.toFixed();  // returns -123.45
-123.45.toFixed(1);  // returns -123.5
-123.45.toFixed(4);  // returns -123.45
-0.0456.toFixed(1);  // returns -0
-0.0456.toFixed(6);  // -0.0456

楽しい事実:から見られるように符号付きゼロがあります -0.0456.toFixed(1)

参照:+0と-0は同じですか?

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