JeuWeb - Crée ton jeu par navigateur

Version complète : Javascript et la précision des flottants
Vous consultez actuellement la version basse qualité d’un document. Voir la version complète avec le bon formatage.
Pages : 1 2
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 ???
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 !
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
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
merci, je vais utiliser toFixed() je penses

bonne fin de soirée
(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"
si tu veux uniquement faire des incrémentations, travaille sur des entiers !
(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:
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
Pages : 1 2