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:
: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
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
(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.
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 ! iffle:
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