Як розібрати плаваючий знак з двома десятковими знаками у javascript?


410

У мене є такий код. Я хотів би мати його таким, що якщо price_result дорівнює цілому числу, скажімо, 10, то я хотів би додати два десяткових знаки. Так 10 буде 10.00. Або якщо вона дорівнює 10,6, це буде 10,60. Не знаєте, як це зробити.

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

Відповіді:


914

Ви можете використовувати toFixed () для цього

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

1
рада допомогти і продовжувати гарну роботу над - «щодня
вивчайте

3
toFixed є досить баггі, хоча. Крім того, ось кращий посилання, ніж w3schools developer.mozilla.org/en-US/docs/JavaScript/Reference/…
gotofritz

125
але toFixed () повертає число як рядок, якщо ви порівнюєте числа, вам потрібно знову використовувати parseFloat.
Педро Муніз

19
Використовуйте var twoPlacedFloat = + parseFloat(yourString).toFixed(2)для перетворення на плавати
Хосе Руй Сантос,

13
Додайте паролі, щоб отримати число замість рядка: parseFloat ((yourString) .toFixed (2));
pvanallen

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

Я написав програму кошика для покупок і спробував використовувати методи toFixed () та round (), прив'язані до методу parseFloat (). Жоден із цих методів не працював з parseFloat ().
Chris22

Це врятувало мені деякі головні болі. +1 просто для цього. Я не уявляв, що це перетворить числа на рядки.
Лукас

@Lukas Ні, якщо розібратисяFloat
Vlada

Це повернеться 2, якщо я застосую номер "2.00"
Саурін Дашадія

Цей метод призначений для виправлень, а не для форматування. Наприклад: 0.1 + 0.2 // 0.30000000000000004тому мені потрібна корекція для цього(0.1+0.2).round() // 0.3
Влада

47

Якщо вам потрібна продуктивність (як в іграх):

Math.round(number * 100) / 100

Це приблизно в 100 разів швидше, ніж parseFloat (number.toFixed (2))

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


5
З наведеною вище формулою "2.00" повертається 2. але я хочу, щоб вона була 2.00.
Саурін Дашадія

5
Не можна мати це обома способами. Якщо ви хочете, щоб результатом було число, а не рядок, то ви не отримаєте проміжних нулів. Таким чином, ви можете використовувати перераховане вище в рядок: var twoPlacedFloat = (Math.round (2.002745 * 100) / 100) .toFixed (2);
pvanallen

3
Чи збільшиться швидкість, якщо я зміню 100 на 200?
жаль

Якщо кількість операцій з плаваючою комою залишиться однаковою, швидкість буде однаковою, тому ні
Роб Боерман

Чому ні простий number * 1мені щось не вистачає maybe?
ncubica

11

Щоб повернути число, додайте ще один рівень дужок. Тримає його в чистоті.

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

2
Ви щось пропускаєте у своїй формулі? var twoPlacedFloat = parseFloat(('2.00').toFixed(2))створює помилку.
Саурін Дашадія

Вибачте, замість числа була змінна рядка, яка потребує toFixed () - виправлена ​​зараз. Але відповідь Роба за допомогою Math.round - це те, що слід враховувати з точки зору продуктивності.
pvanallen

Це має бути коментарем до відповіді Влада.
Родрірокр

5

Якщо ваша мета полягає в розборі, і ваш внесок може бути буквальним, то ви б очікувати, що floatі toFixedне передбачатиме , що, так що тут дві прості функції , щоб забезпечити це:

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.5espected 10.50. Також parseFloat(parseFloat('10.50').toFixed(2))повернення10.5
МТК

Це поплавок, тому 10,5 дорівнює 10,50
Savage

Я знаю, що 10,5 == 10,50, але мені потрібно надрукувати клієнту 10.50, а не 10.5
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 немає подібної функції.
Родрірокр

1

Короткий відповідь @sd : Немає способу в JS мати значення типу типу Number з проміжними нулями після десяткових знаків.

Довгий відповідь: властивість JavaScript toFixedабо toPrecisionфункція JavaScript для повернення рядка. Причиною цього є те, що тип даних типу не може мати значення типу = 2,00, він завжди буде видаляти проміжні нулі після десяткових. Це вбудована властивість типу Data Number. Тож для досягнення вищезазначеного у JS ми маємо 2 варіанти

  1. Або використовуйте дані як рядок або
  2. Погодьтеся, що усічене значення має випадок "0" наприкінці 2,50 -> 2,5. Число Не може мати нулі після десяткових знаків

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

Чого варто: Десяткове число - це десятковий номер, або ви округляєте його до якогось іншого значення, чи ні. Внутрішньо він наблизить десятковий дріб відповідно до правила артметіки з плаваючою комою та керованості. Він зберігає десяткове число (плаваюча точка, у JS - подвійне) внутрішньо, незалежно від того, скільки цифр ви хочете відобразити.

Щоб представити його для відображення, ви можете вибрати точність відображення до того, що вам потрібно, шляхом перетворення рядків. Презентація - це проблема відображення, а не зберігання.


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 

Ініціалізуйте BuildA форми 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 це потрібно використовувати в режимі inline, після того parseFloat()як я оновив відповідь @zsalzbank
Alastair

3
Ні, це не працює. Ви можете спробувати Math.round (parseFloat (yourString), 2);
Augie Gardner

1
Чому б не дати відповідь, яка ніколи не спрацює? Просто немає такого методу, як round()для чисел у js. Справжнє питання - хто це спровокував.
meandre
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.