Dlaczego tak się wydarzy:

window.onload = function(){
    var bob=new Number(1);  
    for (var i=0; i<8 ;i++){        
        bob=Number(bob+1.1)             
    }

}

Alerty: 2.1.

3.2

4.300000000000001.

5.4

6.5.

7.6.

8.7.

9.79999999999999.

0
deach 2 listopad 2011, 05:33

4 odpowiedzi

Najlepsza odpowiedź

To kwestie zaokrąglone. 4.3 nie ma dokładnej reprezentacji w binarnie.

Jak dokładnie są przechowywane w JavaScript, jest rzeczywiście specyficzne dla wdrożenia, ale zawsze jest binarnym punktem zmiennym.

Edytuj:

Wygląda na to, że moje informacje są trochę przestarzałe. Standardowy obecnie określa DoublePrecyzja Format 64-bitowy IEEE 754 Wartości

Spinki do mankietów:

0
Dennis 2 listopad 2011, 01:49

Ponieważ numer JavaScript jest w rzeczywistości podwójną precyzją:

Ze specyfikacji:

4.3.19
 Number value
  primitive value corresponding to a double-precision
  64-bit binary format IEEE 754 value
0
david 2 listopad 2011, 01:36

Bo w JavaScript "Liczby" domyślnie do pływającego punktu. Nawet "ja" ;-) i, oczywiście "Bob".

I liczby pływających punktów są przybliżone .

Jeśli chcesz, możesz użyć "podłogi ()" i "Ceil ()"

PS: Możesz także użyć parseint (), aby przekonwertować pływak do int:

parseInt (4.33) // Result = 4

Lub okrągłe ():

round (3.2 + 1.1) // 4.3, not 4.300000000000001
0
paulsm4 2 listopad 2011, 01:41

Problem ma wspólnego z tym, jak komputer, który działa na podstawie (2), oblicza arytmetykę podstawy (10). Jest wiele artykułów wyjaśniających niuansów.

Jeśli jeszcze nie rozwiązałeś swojego problemu, za każdym razem, gdy używasz numerów pływających punktów, należy również masować wyjście za pomocą odpowiedniej funkcji.

Zazwyczaj używam {x0}} zaokrągla odpowiednią liczbę miejsc dziesiętnych.

0
hafichuk 2 listopad 2011, 01:48