JeuWeb - Crée ton jeu par navigateur
Javascript et la précision des flottants - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Javascript et la précision des flottants (/showthread.php?tid=5086)

Pages : 1 2


Javascript et la précision des flottants - php_addict - 16-08-2010

bosoir

j'ai un truc très étrange en JS:

Code PHP :
<?php 
var test=1.1+0.1;
alert(test);

rien de plus simple comme code me direz vous...et ben voici ce que j'obtiens:

[Image: 31149634.jpg]

:cogne:

(testé avec FF et chrome...)

c'est moi qui hallucine ou Javascript ???


RE: mysètre JS , c'est moi qui hallucine ou Javascript? - Globe - 16-08-2010

http://stackoverflow.com/questions/1036662/weird-javascript-behaviour-floating-point-addition-giving-the-wrong-answer


RE: mysètre JS , c'est moi qui hallucine ou Javascript? - Sephi-Chan - 16-08-2010

Stack Overflow - Is JavaScript’s Math broken?

En gros, les nombres trop petits ne peuvent pas être représentés avec précision, d'où ces valeurs étranges pour ces petits nombres.


Sephi-Chan, sympa le screenshot d'alert() ! Back to 1995 !


RE: mysètre JS , c'est moi qui hallucine ou Javascript? - php_addict - 16-08-2010

merci pour vos reponses

donc c'est normal? c'est dingue quand même...savoir que mon ordi ne sait pas calculer 1 + 0.1 c'est quand même drôle Wink

mais quelle est alors la solution pour que 1 + 0.1 fasse 1.1 ? je peut pas arrondir...couper après la virgule sans arrondir?

PS: c'est pour incrementer de 0.1 un champs input d'un formulaire avec un joli onclick, et j'ai pas très envie que cela me donne des trucs du genre 1.0000000012

bonne soiree


RE: mysètre JS , c'est moi qui hallucine ou Javascript? - Sephi-Chan - 16-08-2010

Ce n'est pas qu'il ne sait pas calculer, c'est une histoire de stockage sur 2 bits. Pour réglier le problème tu peux utiliser une échelle plus grande (n*10, par exemple) ou utiliser la méthode toPrecision de l'objet Number.


Sephi-Chan


RE: mysètre JS , c'est moi qui hallucine ou Javascript? - php_addict - 16-08-2010

merci, je vais utiliser toFixed() je penses

bonne fin de soirée


RE: mysètre JS , c'est moi qui hallucine ou Javascript? - Ter Rowan - 16-08-2010

(16-08-2010, 10:35 PM)Sephi-Chan a écrit : Ce n'est pas qu'il ne sait pas calculer, c'est une histoire de stockage sur 2 bits.

ben justement si il faut trouver une parade c'est qu'il ne sait pas calculer correctement ce nombre


c'est du même niveau qu'un hack pour ie ou ce genre de chose

voire même pire, on est quand même sur une opération de base : sommer deux réels qui n'ont "qu'une" décimale

et ça , ça ne se fait pas naturellement

malheureux qu'on ne corrige pas la manière de stoker/calculer/je sais pas quoi pour y arriver "naturellement"


RE: Javascript et la précision des flottants - niahoo - 17-08-2010

si tu veux uniquement faire des incrémentations, travaille sur des entiers !


RE: Javascript et la précision des flottants - Sephi-Chan - 17-08-2010

(16-08-2010, 11:51 PM)Ter Rowan a écrit :
(16-08-2010, 10:35 PM)Sephi-Chan a écrit : Ce n'est pas qu'il ne sait pas calculer, c'est une histoire de stockage sur 2 bits.

ben justement si il faut trouver une parade c'est qu'il ne sait pas calculer correctement ce nombre


c'est du même niveau qu'un hack pour ie ou ce genre de chose

voire même pire, on est quand même sur une opération de base : sommer deux réels qui n'ont "qu'une" décimale

et ça , ça ne se fait pas naturellement

malheureux qu'on ne corrige pas la manière de stoker/calculer/je sais pas quoi pour y arriver "naturellement"

Propose un ticket aux développeurs de Javascript. Wink

Sauf que… Ceci est un comportement conforme au standard standard IEEE 754, qui définit ce type d'opération sur les flottants. D'accord, ce n'est pas le comportement qu'on attend, ce n'est pas naturel pour nous, mais — sans ironie — c'est une feature, pas un bug. Tout ça est expliqué dans l'article What Every Computer Scientist Should Know About Floating-Point Arithmetic.

Après, moi aussi je préférerais que ça respecte une approche plus naturelle, mais je n'avais qu'à naître plus tôt et participer à l'élaboration de ces standards… En attendant j'en prends connaissance et je fais avec, parce que c'est pas près de changer. Et, coup de chance, on ne nous laisse pas tout seul et on dispose d'une panoplie de méthodes utiles dans l'objet Number.


Sephi-Chan, Ah les mecs, sortis de PHP vous êtes paumés ! Confusediffle:


RE: Javascript et la précision des flottants - srm - 17-08-2010

En effet en Scala on a le même problème que l'on peut résoudre en utilisant des BigDecimal :
Code PHP :
<?php 
scala
> val test = 1.1 + 0.1
test
: Double = 1.2000000000000002

scala
> val test = (1.1 : BigDecimal) + (0.1 : BigDecimal)
test: scala.math.BigDecimal = 1.2