Reglamento general de los foros   •   FAQ   •   Buscar en el foro •  Registrarse | Iniciar sesión 



Portada » Foros Linux » Desarrollo » Programación


Nuevo tema Responder al tema
 [ 3 mensajes ] 
Patrocinadores

Autor
Buscar:
Mensaje


Nota Publicado: Jue Mar 06, 2008 8:57 pm 
Arriba  
En javascript (una vieja implementacion en netscape para elementos dinamicos en el cliente) hacer algo mas que mover cosas es ya algo inpredecible, debido a que el lenguaje no fue hecho con esa finalidad... en este caso multiplicar con decimales! nos resulta a veces unos resultados de varios digitos en vez de los validos! Es decir, hacer operaciones matematicas resulta a veces en decimales errones, por varios digitos, pero con la cuenta exacta.

este error es conocido como error de punto flotante, y es normal y comun en javascript. No afecta la cuenta real porque ocurre siempre el el decimal 13 a 15. Pueden restar 4-1,18 (4-1.18) y les resultara A VECES en 2.8200000000000003

se me ha presentado y POR AHORA ! solo lo he resuelto picando el resultado, despues publicare una solucion si la llego a encontrar.

ejemplo: tenemos esta funcion que multiplica dos numeros...

function multipliquenumbers(mona, monb)
{
// sustituimos cualquier coma por punto para indicar los decimales:

mona = mona.replace(",","."); // en javascript no hay separadores y los decimales se separan con puntos
monb = monb.replace(",","."); // en javascript no hay separadores y los decimales se separan con puntos

// realizamos la multiplicacion:

var multi = mona * monb ; // c = a * b (uff que dificil, se revento el cerebro alli)

// en javascript los tipos de datos no existen especificamente, en u principio no existian

multi = multi + ""; // se forza un conversion a string para poder trabajar con cadenas

// si al total de caracteres le quito la cantidad que ahy en la posicion de la coma.....

var cantdec = multi.length - multi.indexOf(".") ; // ...se calcula la cantidad de decimales

alert( " numero "+multi+" cant dec "+cantdec);

return false;

}

Como veran, si usan el scripot, retornaran varias veces, un decimal extraño, por los momentos pueden "cortarlo y listo" poniendo a partir de la resta este codigo

diff:

......

// si al total de caracteres le quito la cantidad que ahy en la posicion de la coma.....

var cantdec = multi.length - multi.indexOf(".") ; // ...se calcula la cantidad de decimales

var limdeci = 3;

if( cantdec > limdeci+1 ) // decimales mas el punto
{
// se cortan los decimales extras
newnum = multi.substring(0, multi.indexOf(".")+ (limdeci+1) );
}


alert( " numero "+multi+" cant dec "+cantdec+" newnum "+newnum);

return false;

}

solo cambien el "3" por la cantidad de cecimales que se desea mostrar, o pueden detectar si hay decimales y simplemente cortarlo todo.

  

Desconectado
Moderador
Moderador
Avatar de Usuario

Registrado: Mié Nov 28, 2007 8:00 am
Mensajes: 1425
Ubicación: En la X del explorer (pulse para llamar)

Nota Publicado: Vie Mar 07, 2008 12:41 pm 
Arriba  
Eso ocurre en todos los lenguajes de programación.
Como sabrás la máquina no trabaja en decimal sino en binario. Serías capaz de representar el número 1.18 en binario? Seguramente no, ya que debe tener demasiados 0 y 1 y la máquina no puede trabajar con ellos. (Puedes hacer la prueba intentando representar ese número en binario para ver cuántos bits necesitas)
Los lenguajes de uso general tienen esa limitación de ahí que nunca se debe comparar con un = números decimales, aún tan simples como (1/3)*3==1 porque pueden resultar erroneas.
La típica solución (si no puedes acceder a un lenguaje matemático que pueda soportarlo) es realizar una acotación. Por ejemplo: (1/3)*3<1.0000001 and (1/3)*3>0.9999999

 Perfil  


Nota Publicado: Vie Mar 07, 2008 8:46 pm 
Arriba  
esto no ocurre en todos los lenguajes, solo en los de este tipo, pues no poseen un buen tamano para representar un numero flotante (debido a su naturaleza de uso), es mas NO POSEEEN una clara separacion de tipos de datos, por la naturaleza del mismo.

De ayi que se compruebe los tamanos soportados por tipos de datos al hacer un "sh ./configure" para los compiladores como gcc, pues estos si deben tener suficiente tamano para realizar los ajustes que solucionan el problema (electronica digital y programacion de bajo nivel), aun investigo como es que se soluciona.

estas en lo correcto de todas maneras, pues eso es lo que llaman "error del punto flotante" y ocurre en las maquinas, cuando no tienen un buen tamano para representar el complemento a dos de un numero binario (electronica digital) , que es la conversion binaria que mencionas. Javascript es un interpretador, como hacer las veces de una maquina y lleva los numeros a binario, pues es como emular.

cuando se opera, solo existe la operacion suma, de ella se derivan todas las demas, porque se llevan a cabo en binario, una resta es una suma con complemento a dos.

tu referencia de acotacion es la indicada y es lo que se usa en javascript y esa cosa de action script para comparaciones.

  
Mostrar mensajes previos:  Ordenar por  
 [ 3 mensajes ] 
Nuevo tema Responder al tema

Saltar a:  


 Temas relacionados   Autor   Respuestas   Vistas   Último mensaje 
error en disco duro casi resuelto

en Sistema

cordobedp

0

191

Jue Oct 14, 2010 8:50 pm

cordobedp Ver último mensaje

DERIVE 6 MATEMATICAS

en Software

jhosman55

2

3194

Mié May 03, 2006 6:21 pm

Ayax Ver último mensaje

resolver formulas matematicas con algoritmo

[ Ir a página: 1, 2 ]

en Programación

gemmabris

18

4502

Vie Mar 07, 2008 5:37 pm

akodo Ver último mensaje

Mi puppy no sabe matemáticas.. ¿Que le pasa?

en Sistema

cdar

2

785

Jue Nov 29, 2007 12:15 am

cdar Ver último mensaje

decimales en php (SOLUCIONADO)

en Programación

greer

3

199

Lun Feb 06, 2012 5:52 pm

greer Ver último mensaje



¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados

No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro
No puede enviar adjuntos en este Foro

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group :: Style based on FI Subice by phpBBservice.nl :: Todos los horarios son UTC + 1 hora [ DST ]
Traducción al español por Huan Manwë
phpBB SEO