Problème calculs décimaux en JavaScript

Fermé
Utilisateur anonyme - 12 nov. 2012 à 01:41
 Utilisateur anonyme - 14 nov. 2012 à 11:50
Bonjour!

Alors depuis quelques mois je me suis mis au JavaScript, et j'ai programmé avec du HTML et CSS (pour le formulaire, et CSS pour le style) une calculatrice de base, et j'ai rajouté quelques fonctions, comme effacer le dernier chiffre écrit, et la permission d'ommetre les fois lorsqu'ils sont suivis d'une parenthèse...

Enfin le problème, c'est les calculs avec les nombres décimaux: ex:3+0,4 il me donne 4, c'est assez embêtant... Voici mon code complet:

<html>
<head>
<title> Calculatrice - by Anselme</title>
<style type="text/css">
table
{
border: 3px solid black; background-color: grey; border-radius: 9px;
}

.input
{
border: solid 2px black; background-color: lightgrey;

}
td
{ border: solid 1px turquoise;
}
.tdsp
{
border: solid 1px turquoise;
}
b
{
font-family: vardana;
color: red;
}
.by {
font-size: 9px; color: blue;
}
.eg {
background-color: yellow;
}
</style>
<script language="JavaScript">
function effacer()
{
document.calculeforme.screen.value = ""
}

function ajoutnb(Signe)
{
document.calculeforme.screen.value += Signe
}

function resultatcalc()
{
if (document.calculeforme.screen.value != "")
{
document.calculeforme.screen.value = eval(document.calculeforme.screen.value)
}
else
{
document.calculeforme.screen.value = "ERREUR"
}
}
var evala=document.calculeforme.screen.value;
var longu=evala.length;
var ar=evala.indexOf("(")
var para=ar+1
var par=evala.indexOf(")")
var prod2=evala.substring(para, par);
var evalprod2=eval(prod2)
var prod1=evala.substring(0, para-1);
if (evalprod2)
{
document.calculeforme.screen.value=(prod1*evalprod2)
}
function effacerd()
{
var l=document.calculeforme.screen.value.length;
document.calculeforme.screen.value=document.calculeforme.screen.value.substring(0, l-1)
}
</script>
</head>
<body bgcolor="lightblue">
<div align="center">
<b> <i>"Calculatrice" par Anselme Clergeot</i></b>
</div>
<br>
<br>
<div align="center">
<table>
<tr> <form name="calculeforme">
<td class="tdsp"><input type="text" name="screen" class="input" readonly class="coingauchehaut"></input>

<td align="center">
<input type="button" value=" , " onClick="ajoutnb(',')" class="coindroithaut"></input>
</td>

</tr>
<tr>
<td align="center">
<input type="button" value=" 7 " onClick="ajoutnb('7')"></input>
<input type="button" value=" 8 " onClick="ajoutnb('8')"></input>
<input type="button" value=" 9 " onClick="ajoutnb('9')"></input>
</td>
<td align="center">

<input type="button" value="C" onClick="effacer()"></input>
<input type="button" value="<=" onClick="effacerd()"></input>
</td>
</tr>
<tr>
<td align="center">
<input type="button" value=" 4 " onClick="ajoutnb('4')"></input>
<input type="button" value=" 5 " onClick="ajoutnb('5')"></input>
<input type="button" value=" 6 " onClick="ajoutnb('6')"></input>
</td>
<td align="center">
<input type="button" value=" 0 " onClick="ajoutnb('0')"></input></td>
</tr>
<tr>
<td align="center">
<input type="button" value=" 1 " onClick="ajoutnb('1')"></input>
<input type="button" value=" 2 " onClick="ajoutnb('2')"></input>
<input type="button" value=" 3 " onClick="ajoutnb('3')"></input>
<input type="button" value=" = " onClick="resultatcalc()" class="eg"></input>
</td>
<td align="center">
<input type="button" value=" pi " onClick="ajoutnb('3.1415926')"></input></td>
</td>
<tr>
<td align="center">
<input type="button" value=" * " onClick="ajoutnb('*')"></input>
<input type="button" value=" + " onClick="ajoutnb('+')"></input>
<input type="button" value=" - " onClick="ajoutnb('-')"></input>
<input type="button" value=" / " onClick="ajoutnb('/')"></input
</td>
<td>
<input type="button" value=" ( " onClick="ajoutnb('(')"></input>
<input type="button" value=" ) " onClick="ajoutnb(')')"></input
</td>
</tr>

</form>
</table>
</div>
</body>
</html>


Merci, en éspérant que quelqu'un puisse m'aider!
Aurevoir

4 réponses

Bonjour

Le séparateur décimal, c'est le point, pas la virgule.
La virgule sépare plusieurs expressions consécutives, seule la valeur de la dernière est conservée. Donc 3+0,4 il évalue 3+0 puis 4 ; seul le 4 est conservé
1
Utilisateur anonyme
14 nov. 2012 à 08:48
Non, ça ne donne pas 34.000000000006 mais 34.900000000006, ce qui est très proche de la réalité.
Ce problème existe dans tous les langages informatiques, il vient du fait que les ordinateurs ne travaillent pas en décimal mais en binaire. Et la traduction de décimal vers binaire (et réciproquement) n'est pas exacte en général. Tu travailles donc toujours sur des valeurs approchées.
Je ne vois pas de fonction bien adaptée pour faire un arrondi "intelligent" en javascript. Il y en a peut-être, je ne suis pas spécialiste. Il y a bien Math.round(), mais si tu t'en sers trop simplement tu risques de créer d'autres erreurs.
1
Utilisateur anonyme
14 nov. 2012 à 02:28
Merci beaucoup de votre réponse. Seulement, lorsque je met le point, (déjà essayer, je cherche depuis 2 semaines), c'est quand même mieux, mais parfois les calculs sont érronées, par exemple:
6.98*5, cela me donne 34.000000000006 (à 1 ou 2 zéros prets...)
alors qu'en fait c'est 34.9

Pourriez-vous me dire pourquoi ce calcul est faux? Serai-ce du à une de mes fonctions?

Merci.
0
Utilisateur anonyme
14 nov. 2012 à 11:50
Merci.
0