Как разобрать с плавающей запятой с двумя десятичными разрядами в JavaScript?

412

У меня есть следующий код. Мне бы хотелось, чтобы оно было таким, чтобы если price_result равнялся целому числу, скажем, 10, то я хотел бы добавить два десятичных знака. Таким образом, 10 будет 10,00. Или, если он равен 10,6, будет 10,60. Не уверен, как это сделать.

price_result = parseFloat(test_var.split('$')[1].slice(0,-1));
user357034
источник

Ответы:

917

Вы можете использовать toFixed (), чтобы сделать это

var twoPlacedFloat = parseFloat(yourString).toFixed(2)
Махеш Велага
источник
1
рад помочь и продолжить хорошую работу - «каждый день узнавать что-то новое»
Махеш Велага
3
toFixed довольно глючит. Кроме того, вот лучшая ссылка, чем w3schools developer.mozilla.org/en-US/docs/JavaScript/Reference/…
gotofritz
126
но 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
Vlada
источник
Я написал программу для корзины покупок и попытался использовать методы toFixed () и round (), связанные с методом parseFloat (). Ни один из этих методов не работал с parseFloat ().
Chris22
Это избавило меня от некоторых будущих проблем. +1 только за это. Я понятия не имел, что это превратит числа в строки.
Лукас
@ Лукаса нет, если делать parseFloat
Влада
Это возвращает 2, если я
подаю
Этот метод предназначен для исправлений, а не для форматирования. Например: 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я что-то упустил, может быть 🤔?
ncubica
11

Чтобы вернуть число, добавьте еще один слой скобок. Держит это в чистоте.

var twoPlacedFloat = parseFloat((10.02745).toFixed(2));
pvanallen
источник
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.5уважаемое 10.50. Также parseFloat(parseFloat('10.50').toFixed(2))вернитесь10.5
MTK
Хотя это число с плавающей точкой, поэтому 10,5 равно 10,50
Дикарь
Я знаю, что 10,5 == 10,50, но мне нужно печатать на клиенте 10,50, а не 10,5
MTK
2

ceil from lodash, вероятно, лучший

_.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 с конечными нулями после десятичной дроби.

Длинный ответ: Свойство toFixedили toPrecisionфункция JavaScript для возврата строки. Причина этого заключается в том, что тип данных Number не может иметь значение, подобное a = 2.00, он всегда удаляет завершающие нули после десятичного числа. Это встроенное свойство Number Datatype. Так что для достижения вышесказанного в 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    
}
Nimesh
источник
0

Для чего это стоит: десятичное число - это десятичное число, вы либо округляете его до некоторого другого значения, либо нет. Внутренне он будет округлять десятичную дробь в соответствии с правилом вычисления и обработки с плавающей запятой. Он остается внутренним десятичным числом (с плавающей запятой, в JS - двойным) независимо от того, сколько цифр вы хотите отобразить.

Чтобы представить его для отображения, вы можете выбрать точность отображения в соответствии с желаемым путем преобразования строки. Презентация - это проблема отображения, а не хранения.

Андора
источник
0

Вы можете использовать .toFixed () для значения с плавающей запятой 2 цифры

Exampale

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 Form Builder

  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)
equipo_INSA-Inditex_OU
источник
7
@AustinHenley Я попытался использовать round (), и это не сработало. Наверное, поэтому люди не голосуют. Он может ссылаться на Math.round ()
Натан
@ Натан, его нужно использовать в строке, после того parseFloat()как я обновил ответ @zsalzbank
Alastair
3
Нет, это не работает. Вы можете попробовать Math.round (parseFloat (yourString), 2);
Оги Гарднер
1
Почему бы не понизить ответ, который никогда не сработает? Там просто нет такого метода, как round()на числах в JS. Реальный вопрос в том, кто проголосовал за это.
Меандр
-3

Решение, которое работает для меня, заключается в следующем

parseFloat(value)
Хорхе Сантос Нил
источник