2010-07-30 11 views
8

¡Sabes que es una mierda, todo cuando tu computadora no puede obtener una suma correcta!Mi computadora se volvió estúpida. 0 + 20 = 19.921875 !!! ¡Ayuadame!

tengo ni la menor idea de por qué ocurre esto:

_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);

de salida es:

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

19,921875 debe ser de 20! :(

voy a llorar. ¿Mi procesador tiene cáncer? Alzheimer? ¿Quién dijo que los ordenadores no cometen errores?

PS También utilicé aClip._alpha = Math.round (aClip._alpha) pero el rastro fue el mismo!

+1

Probablemente tiene que hacer algo con los puntos flotantes, pero nunca he incursionado en actionscript. ¿Transmitido a int quizás? – Wrikken

Respuesta

23

_alpha valores se almacenan como un byte (debería decir 8 bits - un valor entero 0-255)

Cuando se establece un valor de _alpha, se utiliza un porcentaje. Cuando lo recupera, arroja una representación decimal exacta del porcentaje.

aClip._alpha = 20; 

20% de 256 es 51.2, ya que se almacena como un entero, se conseguirá con piso de 51.

Entonces,

51/256 * 100 es cómo Flash da de nuevo a usted, que es 19.921875.

+3

Muy bien explicado. No tengo experiencia en actionscript e incluso fui "aaahh sí, eso tiene sentido! Lo entiendo!" – rownage

+0

Gracias. Ahora entiendo. – navand

+3

Buena explicación.Pero, sin embargo, IMO es una cuenta de un diseño algo malo en la parte de Macromedias/Adobes, porque 1) no tiene en cuenta partes importantes del principio getter/setter - quiero decir que estableces una variable en 20, pero obtienes [email protected]%$^ justo después y 2) romperá el código directo, lógico y legible como 'if (_alpha == 20)' porque nunca se puede saber con certeza qué '_alpha' igualará incluso con un control total sobre él. Por supuesto, 'int (_alpha)' ayudaría, pero nuevamente simplemente parcha los agujeros en la parte superior de este pequeño lío. Entiendo las razones para no abstraer este más: velocidad. – amn

0

Si mal no recuerdo, el flash almacena alfa internamente con un extraño valor loco, algo así como 0..240 (no creo que sea 255). Podría ser que esté tomando 20 ser 20%, y después del redondeo, 19.92 es el valor más cercano una vez que se convierte de nuevo a un porcentaje?

1

redondeando parece

-1

Independientemente de la validez de otras respuestas, existen artefactos conocidos y bien documentados de la implementación de punto flotante que, entre otros, usa Adobe Flash Player. El siguiente código, por ejemplo, producirá una salida ligeramente incorrecta (si hay tal cosa en matemáticas) de 1.0010000000000001:

trace(0.1009 + 0.9001); 

Todo esto, como he dicho, es parte de la utilización de una aplicación especificación de punto flotante IEEE.

0

El "problema flotante" también se produjo en el cuadro de propiedad del componente en Flash CS5. Después de una nueva instalación, CS5 parece una locura con las propiedades de los componentes, y da 20.00001 después de escribir 20.

Al actualizar su software gracias a Adobe Application Manager, se soluciona este problema.

Cuestiones relacionadas