2009-06-04 6 views
1

Débutant ActionScript 3 question: pourquoiint (bla) donnant réponse différente de (bla) comme int

(Math.sqrt((r * r - (r - i) * (r - i)) as Number) * 2) as int 

me donner un résultat différent de

int(Math.sqrt((r * r - (r - i) * (r - i)) as Number) * 2) 
+0

Eh bien ... quels sont les résultats? –

+0

9.59 ... sans aucun casting vers int, 9 avec le second, et 0 pour le premier. – Archagon

+0

J'ai fait un peu plus de tests, et apparemment (9 comme int), (9.5 comme nombre), et (int (9.5)) donnent les résultats corrects, mais (9.5 comme int) aboutit à null. Pourquoi cela serait-il le cas? – Archagon

Répondre

8

L'opérateur as est une distribution directe , alors que int() trouve implicitement le floor du Number (notez qu'il n'appelle pas réellement Math.floor, cependant). Le Adobe docs for as dit qu'il vérifie que le "premier opérande est un membre du type de données spécifié par le deuxième opérande." Puisque 9.59 n'est pas représentable en tant qu'int, la distribution as échoue et renvoie null, alors que int() trouve d'abord le plancher du nombre, puis le convertit en int.

Vous pouvez faire Math.floor(blah) as int, et cela devrait fonctionner, même si ce serait plus lent. En supposant que vous voulez un arrondi int, Math.round(blah) as int serait plus correct, mais int(blah + .5) serait plus rapide et rond correctement.

2

L'opérateur as est pas grand-chose comme un casting, plus quelque chose comme:

i est int? int: null;

Ceci est déroutant comme diable. Il vérifie si la variable est de ce type, si c'est le cas, la variable est retournée, sinon vous obtiendriez null (0 pour un int).