Como analisar float com duas casas decimais em javascript?

411

Eu tenho o seguinte código. Gostaria de tê-lo de tal forma que, se price_result igual a um número inteiro, digamos 10, gostaria de adicionar duas casas decimais. Então 10 seria 10,00. Ou, se for igual a 10,6, seria 10,60. Nao tenho certeza de como fazer isso.

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

Respostas:

915

Você pode usar toFixed () para fazer isso

var twoPlacedFloat = parseFloat(yourString).toFixed(2)
Mahesh Velaga
fonte
1
fico feliz em ajudar e manter o bom trabalho - "aprendendo uma coisa nova todos os dias"
Mahesh Velaga
3
O toFixed é bastante problemático. Além disso, aqui está um link melhor do que w3schools developer.mozilla.org/en-US/docs/JavaScript/Reference/...
gotofritz
125
mas toFixed () retorna número como string, se você comparar números, precisará usar o parseFloat novamente.
Pedro Muniz
19
Use var twoPlacedFloat = + parseFloat(yourString).toFixed(2)para converter em float #
Jose Rui Santos
13
Adicione parens para obter um número em vez de string: parseFloat ((yourString) .toFixed (2));
pvanallen
50

Quando você usa toFixed, ele sempre retorna o valor como uma sequência. Isso às vezes complica o código. Para evitar isso, você pode fazer um método alternativo para Number.

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

E use:

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

ou simplesmente:

(22/7).round(3); // 3.143
Vlada
fonte
Eu escrevi um programa de carrinho de compras e tentei usar os métodos toFixed () e round () acorrentados ao método parseFloat (). Nenhum desses métodos funcionou com o parseFloat ().
precisa
Isso me salvou algumas possíveis dores de cabeça. +1 apenas por isso. Eu não tinha ideia de que transformaria números em strings.
Lukas
@Lukas não é, se fazer parseFloat
Vlada
Isso retorna 2 se eu aplicar ao número '2,00'
Saurin Dashadia
Este método é para correções, não para formatação. Por exemplo: 0.1 + 0.2 // 0.30000000000000004assim que eu preciso de correção para isso(0.1+0.2).round() // 0.3
Vlada
47

Se você precisar de desempenho (como nos jogos):

Math.round(number * 100) / 100

É cerca de 100 vezes mais rápido que parseFloat (number.toFixed (2))

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

Rob Boerman
fonte
5
Com a fórmula acima, '2,00' retorna 2., mas quero que seja 2,00.
Saurin Dashadia 9/04/2015
5
Você não pode ter as duas coisas. Se você deseja que a saída seja um número em vez de uma sequência, não receberá zeros à direita. Portanto, você pode usar o acima convertido em uma string: var twoPlacedFloat = (Math.round (2.002745 * 100) / 100) .toFixed (2);
pvanallen
3
A velocidade aumentará se eu mudar de 100 para 200?
Alashow 13/08/19
Se o número de operações de ponto flutuante permanecer o mesmo a velocidade será a mesma, de modo nenhum
Rob Boerman
por que não é simples, number * 1estou perdendo alguma coisa, talvez?
Ncubica 11/11
11

Para retornar um número, adicione outra camada de parênteses. Mantém limpo.

var twoPlacedFloat = parseFloat((10.02745).toFixed(2));
pvanallen
fonte
2
Está faltando algo em sua fórmula? var twoPlacedFloat = parseFloat(('2.00').toFixed(2))gera erro.
Saurin Dashadia
desculpe, tinha uma variável de string em vez de um número, que toFixed () precisa - corrigido agora. Mas a resposta de Rob usando Math.round é algo a considerar em termos de desempenho.
pvanallen
Este deve ser um comentário para a resposta de Vlada.
Rodrirokr 21/08/19
5

Se seu objetivo é analisar e sua entrada pode ser literal, você esperaria um floate toFixednão fornecerá isso; portanto, aqui estão duas funções simples para fornecer isso:

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

function parseFloat2Decimals(value,decimalPlaces) {
    return parseFloat(parseFloat(value).toFixed(decimalPlaces));
}
Selvagem
fonte
2
Isso não funciona da maneira esperada. parseFloat(parseFloat('10.5').toFixed(2))retorno 10.5espiado 10.50. Também parseFloat(parseFloat('10.50').toFixed(2))retornar10.5
MTK
É uma bóia, porém, assim 10.5 é igual a 10,50
Savage
Eu sei que 10,5 == 10,50, mas eu preciso para imprimir para o cliente 10,50 Não 10.5
MTK
2

teto de lodash é provavelmente o melhor

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

também funcionará com um número e é seguro

Antonio Terreno
fonte
1
Resposta viável se estiver usando lodash, atualmente estou usando underscore.js e atualmente no 1.9.1 não tem uma função semelhante.
Rodrirokr 21/08/19
1

@sd Resposta curta: Não há como o JS ter o valor do tipo de dados Number com zeros à direita após um decimal.

Resposta longa: É propriedade toFixedou toPrecisionfunção do JavaScript retornar a String. A razão para isso é que o tipo de dados Number não pode ter um valor como a = 2,00; ele sempre remove os zeros à direita após o decimal. Essa é a propriedade embutida do Number Datatype. Então, para alcançar o acima em JS, temos 2 opções

  1. Use dados como uma string ou
  2. Concorde em ter um valor truncado com o caso '0' no final ex 2.50 -> 2.5. Número não pode ter zeros à direita após decimal
abhinav pandey
fonte
0

Por favor, use a função abaixo se você não quiser terminar.

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
fonte
0

Pelo que vale: Um número decimal é um número decimal, você o arredonda para outro valor ou não. Internamente, ele aproximará uma fração decimal de acordo com a regra da aritmética e manipulação de ponto flutuante. Ele permanece um número decimal (ponto flutuante, em JS um duplo) internamente, independentemente de quantos dígitos você deseja exibi-lo.

Para apresentá-lo para exibição, você pode escolher a precisão da exibição para o que quiser, por conversão de string. A apresentação é um problema de exibição, não de armazenamento.

andora
fonte
0

Você pode usar .toFixed () para o valor flutuante de 2 dígitos

Exampale

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

//output
9.99
Rizo
fonte
-1

Tente isso (veja os comentários no código):

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);
}
Mitre Slavchev
fonte
-1

JavaScript simples, string para flutuar:

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);
    }
}
Arun Prasad ES
fonte
-2

A solução que funciona para mim é a seguinte

parseFloat(value)
Jorge Santos Neill
fonte
-2
Solution for FormArray controllers 

Inicializar o FormArray Form Builder

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

Criar formulário

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

Definir valores do formulário no Controlador de formulários

  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;
  }
Thulasiram Virupakshi
fonte
-3

Eu tenho outra solução.

Você pode usar round()para fazer issotoFixed()

var twoPlacedFloat = parseFloat(yourString).round(2)
equipo_INSA-Inditex_OU
fonte
7
@AustinHenley Tentei usar round () e não funcionou. Provavelmente é por isso que as pessoas estão votando negativamente. Ele pode estar se referindo a Math.round ()
Nathan
@ Nathan precisa ser usado em linha, depois parseFloat()que eu atualizei a resposta por @zsalzbank
Alastair
3
Não, não funciona. Você pode tentar Math.round (parseFloat (yourString), 2);
Augie Gardner
1
Por que não recusar uma resposta que nunca funcionará? Simplesmente não existe um método como round()nos números em js. A verdadeira questão é quem aprovou isso.
meandre 25/11