JavaScriptで小数点以下2桁でフロートを解析する方法は?


411

次のコードがあります。price_resultが整数、たとえば10と等しい場合、小数点以下2桁を追加したいと思います。したがって、10は10.00になります。または、10.6の場合は10.60になります。これを行う方法がわかりません。

price_result = parseFloat(test_var.split('$')[1].slice(0,-1));

回答:


915

あなたはそれをするためにtoFixed()を使うことができます

var twoPlacedFloat = parseFloat(yourString).toFixed(2)

1
「毎日新しいことを学ぶ」のを手伝って良い仕事を続けてくれてうれしい
Mahesh Velaga

3
toFixedはかなりバグがあります。また、ここでW3Schoolsのより良いリンクですdeveloper.mozilla.org/en-US/docs/JavaScript/Reference/...は
gotofritz

125
しかし、toFixed()は数値を文字列として返します。数値を比較する場合は、parseFloatを再度使用する必要があります。
Pedro Muniz 2013年

19
var twoPlacedFloat = + parseFloat(yourString).toFixed(2)フロートへの変換に使用
ホセルイサントス

13
文字列ではなく数値を取得するには、括弧を追加します。parseFloat((yourString).toFixed(2));
pvanallen 2014年

50

を使用するとtoFixed、常に文字列として値が返されます。これにより、コードが複雑になる場合があります。これを回避するには、Numberの代替方法を作成します。

Number.prototype.round = function(p) {
  p = p || 10;
  return parseFloat( this.toFixed(p) );
};

そして使用:

var n = 22 / 7; // 3.142857142857143
n.round(3); // 3.143

または単に:

(22/7).round(3); // 3.143

私はショッピングカートプログラムを作成し、parseFloat()メソッドにチェーンされたtoFixed()およびround()メソッドを使用してみました。これらのメソッドはどちらもparseFloat()で機能しませんでした。
Chris22、2013年

これは私にいくつかの将来の頭痛を救った。そのための+1。それが数字を文字列に変換することを私は知りませんでした。
Lukas、

@Lukasはそうではありません、parseFloatを実行する場合
Vlada 14

これは、「2.00」番号に適用すると2を返します
Saurin Dashadia

このメソッドはフォーマット用ではなく、修正用です。例:0.1 + 0.2 // 0.30000000000000004そのため、修正が必要(0.1+0.2).round() // 0.3
Vlada

47

ゲームなどでパフォーマンスが必要な場合:

Math.round(number * 100) / 100

parseFloat(number.toFixed(2))の約100倍の速さ

http://jsperf.com/parsefloat-tofixed-vs-math-round


5
上記の式で '2.00'は2を返しますが、2.00にしたいです。
Saurin Dashadia

5
あなたはそれを両方の方法で持つことはできません。出力を文字列ではなく数値にしたい場合は、末尾のゼロは取得されません。したがって、上記を文字列に変換して使用できます。var twoPlacedFloat =(Math.round(2.002745 * 100)/ 100).toFixed(2);
pvanallen

3
100を200に変更すると速度が向上しますか?
alashow 2017

浮動小数点演算の数が同じである場合、速度は同じになるため、そうではありません
Rob Boerman '13 / 08/13

なぜ単純なnumber * 1ものがないのですか?
ncubica

11

数値を返すには、括弧の別のレイヤーを追加します。清潔に保ちます。

var twoPlacedFloat = parseFloat((10.02745).toFixed(2));

2
数式に何か不足していますか?var twoPlacedFloat = parseFloat(('2.00').toFixed(2))エラーが発生します。
Saurin Dashadia

申し訳ありませんが、toFixed()が必要とする数値の代わりに文字列変数がありました-今修正されました。しかし、Math.roundを使用したロブの答えは、パフォーマンスの点で考慮する必要があります。
pvanallen

これはウラダの答えに対するコメントであるべきです。
Rodrirokr

5

解析が目的であり、入力がリテラルである可能性がある場合は、を期待し、floatそれtoFixedを提供しないため、これを提供する2つの単純な関数を次に示します。

function parseFloat2Decimals(value) {
    return parseFloat(parseFloat(value).toFixed(2));
}

function parseFloat2Decimals(value,decimalPlaces) {
    return parseFloat(parseFloat(value).toFixed(decimalPlaces));
}

2
これは想定どおりに機能しません。parseFloat(parseFloat('10.5').toFixed(2))見返りを10.5返す10.50。またparseFloat(parseFloat('10.50').toFixed(2))戻る10.5
MTK

ただし、フロートなので、10.5は10.50に等しい
サベージ

10.5 == 10.50であることは知っていますが、10.5ではなくクライアント10.50に印刷する必要があります
MTK

2

ロダッシュからの天井はおそらく最高です

_.ceil("315.9250488",2) 
_.ceil(315.9250488,2) 
_.ceil(undefined,2)
_.ceil(null,2)
_.ceil("",2)

番号でも機能し、安全です


1
lodashを使用している場合の実行可能な答えは、私は現在underscore.jsを使用しており、現在1.9.1に同様の機能がないことです。
Rodrirokr

1

@sdの 短い回答: JSでは、10進数の後に後続ゼロがあるNumberデータ型の値を持つ方法はありません。

長い答え:文字列を返すには、JavaScriptのプロパティtoFixedまたはtoPrecision関数です。この理由は、数値データ型はa = 2.00のような値を持つことができないため、小数点以下の後続ゼロは常に削除されます。これは数値データ型の組み込みプロパティです。JSで上記を実現するには、2つのオプションがあります

  1. データを文字列として使用するか、
  2. 2.50-> 2.5のように、末尾が大文字の「0」で値が切り捨てられることに同意します。 数値は10進数の後にゼロを付けることはできません

0

四捨五入したくない場合は、以下の関数を使用してください。

function ConvertToDecimal(num) {
    num = num.toString(); //If it's not already a String
    num = num.slice(0, (num.indexOf(".")) + 3); //With 3 exposing the hundredths place
   alert('M : ' +  Number(num)); //If you need it back as a Number    
}

0

その価値について:10進数は10進数であり、他の値に丸めるかどうか。内部的には、浮動小数点の演算と処理のルールに従って小数を概算します。表示する桁数に関係なく、内部的に10進数(JSでは浮動小数点、double)のままです。

表示用に表示するには、文字列変換により、表示の精度を任意に選択できます。プレゼンテーションはストレージの問題ではなく、表示の問題です。


0

.toFixed()を使用して2桁の浮動小数点値を取得できます

let newValue = parseFloat(9.990000).toFixed(2)

//output
9.99

-1

これを試してください(コード内のコメントを参照):

function fixInteger(el) {
    // this is element's value selector, you should use your own
    value = $(el).val();
    if (value == '') {
        value = 0;
    }
    newValue = parseInt(value);
    // if new value is Nan (when input is a string with no integers in it)
    if (isNaN(newValue)) {
        value = 0;
        newValue = parseInt(value);
    }
    // apply new value to element
    $(el).val(newValue);
}

function fixPrice(el) {
    // this is element's value selector, you should use your own
    value = $(el).val();
    if (value == '') {
        value = 0;
    }
    newValue = parseFloat(value.replace(',', '.')).toFixed(2);
    // if new value is Nan (when input is a string with no integers in it)
    if (isNaN(newValue)) {
        value = 0;
        newValue = parseFloat(value).toFixed(2);
    }
    // apply new value to element
    $(el).val(newValue);
}

-1

単純なJavaScript、フロートする文字列:

var it_price = chief_double($("#ContentPlaceHolder1_txt_it_price").val());

function chief_double(num){
    var n = parseFloat(num);
    if (isNaN(n)) {
        return "0";
    }
    else {
        return parseFloat(num);
    }
}


-2
Solution for FormArray controllers 

FormArrayフォームビルダーを初期化する

  formInitilize() {
    this.Form = this._formBuilder.group({
      formArray: this._formBuilder.array([this.createForm()])
    });
  }

フォームを作成

  createForm() {
    return (this.Form = this._formBuilder.group({
      convertodecimal: ['']
    }));
  }

フォームの値をフォームコントローラに設定する

  setFormvalues() {
    this.Form.setControl('formArray', this._formBuilder.array([]));
    const control = <FormArray>this.resourceBalanceForm.controls['formArray'];
    this.ListArrayValues.forEach((x) => {
      control.push(this.buildForm(x));
    });
  }

  private buildForm(x): FormGroup {
    const bindvalues= this._formBuilder.group({
      convertodecimal: x.ArrayCollection1? parseFloat(x.ArrayCollection1[0].name).toFixed(2) : '' // Option for array collection
// convertodecimal: x.number.toFixed(2)    --- option for two decimal value 
    });

    return bindvalues;
  }

-3

他の解決策があります。

round()代わりに使用できますtoFixed()

var twoPlacedFloat = parseFloat(yourString).round(2)

7
@AustinHenley round()を使用してみましたが、機能しませんでした。それがおそらく人々が反対票を投じている理由です。彼はMath.round()を参照している可能性があります
Nathan

@Nathanインラインで使用する必要があります。parseFloat()@ zsalzbankによる回答を更新した後
Alastair

3
いいえ、機能しません。Math.round(parseFloat(yourString)、2);を試すことができます。
Augie Gardner 2014

1
うまくいかない答えに反対票を投じないのはなぜですか?round()jsの数値に対してのようなメソッドはありません。本当の問題は、誰がこれに賛成したかです。
meandre
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.