Converter String em Double [Javascript]

Bom pessual, estou com um problema com javascript, nda complexo, mas não consigo resolver.

tenho uma função que efetua um calculo de porcentagem:

[code]function calc(){

preco = document.getElementById("preco").value;
margem = document.getElementById("margem").value;

if(document.getElementById("margem").value == ""){
	document.getElementById("valor").value = 0;
}else{
	document.getElementById("valor").value = (preco + ( (preco * margem) / 100 ));
}

}[/code]

minha duvida é como eu posso usar essa função para numeros Double…eu tinha usado parseFloat assim:

ai ele funcionava quando preço era inteiro…mas quando preço é double, ele tira o ponto flutuante, ex: 600,60 ele transforma em 600, assim fazendo o calculo errado. ai tirei o parseFloat e coloquei um alert pra testar ai ele imprimiu o valor com ponto flutuante. Então pressuponho q deva ser problema de conversão no javascript…

Será que alguem pode me ajudar a converter esse valor para Double.

Obrigado

Nunca, jamais use aritmetica de ponto flutuante pra valores monetarios. Nem em Java, nem em JavaScript, nem em LISP, nem em SQL.

Você percebeu que seu problema, na verdade, é que você está tentando converter um número com vírgulas.

parseFloat ou parseDouble exige que você use o número em formato americano, portanto você tem de fazer alguns replaces.

http://www.guj.com.br/posts/list/52574.java

oq vc me sugere??

pois como vou fazer isso em javascript se não for em ponto flutuante?

obrigado

[quote=thingol]Você percebeu que seu problema, na verdade, é que você está tentando converter um número com vírgulas.

parseFloat ou parseDouble exige que você use o número em formato americano, portanto você tem de fazer alguns replaces.

http://www.guj.com.br/posts/list/52574.java
[/quote]

vlw a ajuda…nesse link q vc me passou, é usado um eval()

oq seria ele??..é ele q coloca . em vez de , ??

vlw

CV, desculpe a minha ignorancia! Fiquei interessado, como ficaria entao o calculado de valores monetarios? Um pobre mortal conseguiria compreender isso facilmente?

Obrigado!

me deparei com este topico e…
ressucitando das cinzas… pq nao usuaria aritmetica de ponto flutuante e qual a solução viável?

jopss :stuck_out_tongue:

Por que double guarda números em formato científico, sendo assim, perde presição.

No caso de uso de valore monetários, o correto é utilizar inteiro, ou o bigdecimal. Nesse caso não existe o ponto flutuante. Vc calcula tudo como se fosse inteiro e no final divide por 100 para exibir os dados. Mas esse divisão é apenas inteface com o usuário.

Sendo assim, 100 reias fica: 10000 e
e 95,99 fica 9599. Mas para mostrar na tela vc divide isso por cem e o 10000 aparece 100 e o 9599 aparece 95,99. Que são os valores corretos.

Isso não vale só para softwares monetárias não. Vale para qualquer tipo de software de presição.

Se vc criar um software de engenharia com double, existe uma boa chance do prédio cair! Vai faltar presição.

Galera, desculpa ressucitar o tópico novamente, mas não encontrei ajuda em nenhum lugar.

Tenho que calcular o valor com base em um percentual de desconto.
É uma coisa cheia de regras, mas não estou conseguindo calcular o percentual usando só inteiros.

Faço isso em um javascript.

A ideia é assim…
Tenho o valor de um produto (vlPmc) e preciso calcular um desconto de 30% desse produto.
O valor do produto é 20.71, mas não quero perder a precisão, então como sugerido em alguns posts acima, converto ele em uma String e depois em um int sem o ponto flutuante, transformando o valor em 2071.

Em seguida tento calcular 30% desse valor, fazendo uma regra de 3, mas volto a ter o valor com vírgula.

Segue meu código:

[code]
var vlNegociadoTemp = document.getElementById(‘txtDlgGerenciaPraticado’).value;
if (vlNegociadoTemp != ‘’) {
vlNegociadoTemp = (vlNegociadoTemp.replace(",",""));
}

var vlPmcTemp = "" + vlPmc;
if (vlPmcTemp != '') {
	vlPmcTemp = (vlPmcTemp.replace(".",""));		
}

var vlMinimoTemp = (((vlPmcTemp * percDescGerMax)/100)-vlPmcTemp)*-1;

// if (vlMinimoTemp != ‘’) {
// vlMinimoTemp = (vlMinimoTemp.replace(".",""));
// }

var vlNegociadoInt = parseInt(vlNegociadoTemp);
var vlMinimoInt = parseInt(vlMinimoTemp);
var vlPmcInt = parseInt(vlPmcTemp);
 

if (vlNegociadoInt < vlMinimoInt){
	vlNegociadoInt = vlPmcInt;
	document.getElementById('txtDlgGerenciaPraticado').value = vlPmcInt;
}else if (vlNegociadoInt > vlPmcInt){
	vlNegociadoInt = vlPmcInt;
	document.getElementById('txtDlgGerenciaPraticado').value = vlPmcInt;
}

//var pcDescSobreVlTot = ((vlNegociado * 100)/vlPmc - 100) * (-1);
// pcDescSobreVlTot = (eval(pcDescSobreVlTot)).toFixed();

var vlFPComDescSobreVlTot = (vlNegociadoInt * 10)/ 100;

// vlFPComDescSobreVlTot = (eval(vlFPComDescSobreVlTot)).toFixed(2);
vlFPComDescSobreVlTot = vlFPComDescSobreVlTot/100;
document.getElementById(‘txtDlgGerenciaPraticadoFP’).value = vlFPComDescSobreVlTot;[/code]

Coloquei o método todo, mas meu erro está na linha 11, dai pra frente preciso corrigir algumas regras ainda.

Se alguém puder ajudar.

Valeu!!