Es una limitante de action script el no trabajar bien con decimales, por ejemplo haz el siguiente ejemplo:
Código :
var num:Number = 0;
for(var n=0; n<10; n++){
num += 0.1;
trace('El valor de num es '+ num);
}
trace("ahora mira esta condición:");
if(num == 1){
trace('El valor de num si es 1');
}else{
trace('El valor de num no es 1');
}
O intenta este otro más simple:
Código :
trace(10.1 - 10);
Debería dar 0.1, pero sin embargo da una aproximación cercana.
Normalmente como yo lo he llegado a resolver, es que por ejemplo el anterior cálculo, AS no utilice decimales para hacerlo y al final divido el resultado por la cantidad misma de decimales. Con la siguiente función lo podrás comprender:
Código :
function givemeMaxDecimal(numero1, numero2):Number{
var numero1String:String = String(numero1);
var numero2String:String = String(numero2);
var numero1Array:Array = numero1String.split(".");
var numero2Array:Array = numero2String.split(".");
var decimals1:Number = (numero1Array[1].length != undefined)?numero1Array[1].length:0;
var decimals2:Number = (numero2Array[1].length != undefined)?numero2Array[1].length:0;
var maxDecimal:Number = Math.max(decimals1, decimals2);
return Math.pow(10, maxDecimal);
}
En la anterior función saco de los dos números cuál tiene mayor lugar de decimales para poder realizar lo siguiente:
var decimals:Number = givemeMaxDecimal(numero1, numero2);
trace((numero2*decimals - numero1*decimals)/decimals);
El anterior resultado nos dará 0.1 como esperábamos porque para la resta AS no ha utilizado decimales.
Ahora en el ejemplo concreto tuyo lo mejor es redondear, pero de la siguiente manera:
Código :
function giveMeDecimals(numero:Number):Number{
var numeroString:String = String(numero);
var numeroArray:Array = numeroString.split(".");
var decimals:Number = (numeroArray[1].length != undefined)?numeroArray[1].length:0;
return Math.pow(10, decimals);
}
function realRound(numero:Number):Number{
var decimals:Number = giveMeDecimals(numero);
var real:Number = Math.round(numero*decimals)/decimals;
return real;
}
La función realRound lo que hace es dejar al número sin decimales, redondearlo y después dividirlo por la cantidad misma de decimales, parece una tontería pero logra lo que necesitas, compruébalo de la siguiente forma:
Código :
if (realRound(limite_inferior) < realRound(e/10)) {
trace("No debería mostrar este mensaje");
}
No te mostrará es mensaje porque 1.7 no puede ser menor que 1.7