2010-07-30 15 views
8

Wiesz, że to robak - wszystko, gdy komputer nie może uzyskać sumy w prawo!Mój komputer stał się głupi. 0 + 20 = 19,921875 !!! Pomóż mi!

nie mam najmniejszego pojęcia, dlaczego tak się dzieje:

_root.attachMovie("clippy","aClip",_root.getNextHighestDepth()); 

trace("alpha 1 = "+aClip._alpha); 
aClip._alpha = 0; 
trace("alpha 2 = "+aClip._alpha); 
aClip._alpha += 20; 
trace("alpha 3 = "+aClip._alpha); 
aClip._alpha = 20; 
trace("alpha 4 = "+aClip._alpha);

wyjściowa wynosi:

alpha 1 = 100 
alpha 2 = 0 
alpha 3 = 19.921875 
alpha 4 = 19.921875

19,921875 powinno być 20! :(

zamierzam płakać. Czy mój procesor ma raka? Alzheimer? Kto powiedział, że komputery nie popełnia błędów?

PS Ja również aClip._alpha = Math.round (aClip._alpha) ale ślad był taki sam!

+1

Prawdopodobnie musi coś zrobić z liczbami zmiennoprzecinkowymi, ale nigdy nie działałem w ActionScript. Może przesłać do int? – Wrikken

Odpowiedz

23

_alpha wartości są przechowywane w postaci bajtu (należy powiedzieć, 8 bitów - liczbą całkowitą od 0 do 255)

Po ustawieniu wartości _alpha, należy użyć w procentach. Po pobraniu otrzymuje dokładną dziesiętną reprezentację wartości procentowej.

aClip._alpha = 20; 

20% z 256 jest 51.2, ponieważ jest przechowywany jako liczba całkowita, zostanie on powalony na 51.

Następnie

51/256 * 100 jest jak Flash daje go z powrotem do ciebie, co jest 19.921875.

+3

Bardzo dobrze wyjaśnione. Nie mam żadnego doświadczenia w Actioncripcie i nawet ja poszedłem "aaahh tak, to ma sens - rozumiem!" – rownage

+0

Dzięki. Teraz rozumiem. – navand

+3

Dobre wyjaśnienie.Niemniej jednak, IMO stanowi nieco zły projekt na części Macromedias/Adobes, ponieważ 1) lekceważy ważne części zasady getter/setter - mam na myśli ustawienie zmiennej na 20, ale uzyskaj [email protected]%$^zaraz po i 2) złamie prosty, logiczny i czytelny kod, taki jak 'if (_alpha == 20)', ponieważ nigdy nie będziesz mieć pewności co to '_phpha' będzie równe nawet z pełną kontrolą nad nim. Oczywiście 'int (_alpha)' pomogłoby, ale znowu po prostu łata dziury na górze tego małego bałaganu. Rozumiem powody, dla których nie ograniczam tej przyszłości - szybkości. – amn

0

Jeśli dobrze pamiętam, flash przechowuje alfa wewnętrznie z dziwną, szaloną wartością, coś jak 0..240 (nie sądzę, że to 255). być 20%, a po zaokrągleniu, 19.92 jest najbliższą wartością po przeliczeniu z powrotem na procent?

1

Zaokrąglanie w górę wydaje się być

-1

Bez względu na ważność innych odpowiedzi, istnieją znane i dobrze udokumentowane artefakty implementacji zmiennoprzecinkowej, między innymi Adobe Flash Player. Poniższy kod, na przykład, będzie produkować lekko niepoprawne (jeśli istnieje takie coś w matematyce) wyjście 1.0010000000000001:

trace(0.1009 + 0.9001); 

Wszystko to, jak powiedziałem, jest częścią użyciu IEEE pływający wdrożenia specyfikacji punkt.

0

"Pływający problem" wystąpił również w polu właściwości komponentu w programie Flash CS5. Po świeżej instalacji CS5 wydaje się być szalony z właściwościami komponentu i daje 20.00001 po wpisaniu 20.

Aktualizacja oprogramowania za pomocą aplikacji Adobe Application Manager rozwiązuje ten problem.

Powiązane problemy