elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Evitar que muestre números repetidos, problema con decimales.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Evitar que muestre números repetidos, problema con decimales.  (Leído 1,521 veces)
Tachikomaia


Desconectado Desconectado

Mensajes: 1.460


Hackentifiko!


Ver Perfil
Evitar que muestre números repetidos, problema con decimales.
« en: 14 Diciembre 2023, 22:51 pm »

Tema similar a uno que hice recientemente, quiero un programa así:
En la 1era vuelta que muestre 1, es decir un número entero.
En la 2nda vuelta que muestre 2 y 0.1, es decir un número entero y un número con 1 decimal.
En la 3era vuelta que muestre 3, 0.2 y 0.01, es decir un número entero, uno de 1 decimal, y uno de 2 decimales.

Los números deben ser siempre mayores a los anteriores de su tipo y deben tener la cantidad de decimales que corresponde, si tiene menos no debe mostrarse en pantalla.

Logré que los números se generen pero no estoy pudiendo lograr que sólo se muestren los diferentes.

Este es el código que tengo:
Código
  1. Escena 1
  2.   actions for fotograma 1
  3.      MaxDecimales = 0;
  4.      N1 = 0;
  5.   actions for fotograma 2
  6.      Decimales = 0;
  7.   actions for fotograma 3
  8.      Nombre = "N"+Decimales;
  9.      N = (eval(Nombre)*Math.pow(10, Decimales)+1)/Math.pow(10, Decimales);
  10.      // Guardar el valor en la lista correspondiente.
  11.      set (Nombre, N);
  12.      if (Decimales>0) {
  13.         LargoMinimodeDiferencia = Decimales+2;
  14.      } else {
  15.         LargoMinimodeDiferencia = Decimales+1;
  16.      }
  17.      if (String(N-Math.floor(N)).length>=LargoMinimodeDiferencia) {
  18.         // El valor no fue producido, se muestra y se chequea.
  19.         trace ("Se generó "+Nombre+": "+N);
  20.      }
  21.   actions for fotograma 4
  22.      if (Decimales<MaxDecimales) {
  23.         Decimales = Decimales+1;
  24.         gotoAndPlay (3);
  25.      } else {
  26.         // Se creará una nueva lista con decimales más pequeños.
  27.         MaxDecimales = MaxDecimales+1;
  28.         set ("N"+MaxDecimales, 0);
  29.         gotoAndPlay (2);
  30.      }

Salida:
Citar
Se generó N0: 1
Se generó N0: 2
Se generó N1: 0.1
Se generó N0: 3
Se generó N1: 0.2
Se generó N2: 0.01
Se generó N0: 4
Se generó N1: 0.3
Se generó N2: 0.02
Se generó N3: 0.001
Se generó N0: 5
Se generó N1: 0.4
Se generó N2: 0.03
Se generó N3: 0.002
Se generó N4: 0.0001
Se generó N0: 6
Se generó N1: 0.5
Se generó N2: 0.04
Se generó N3: 0.003
Se generó N4: 0.0002
Se generó N0: 7
Se generó N1: 0.6
Se generó N2: 0.05
Se generó N3: 0.004
Se generó N4: 0.0003
Se generó N5: 0.00002
Se generó N0: 8
Se generó N1: 0.7
Se generó N2: 0.06
Se generó N3: 0.005
Se generó N4: 0.0004
Se generó N5: 0.00003
Se generó N0: 9
Se generó N1: 0.8
Se generó N2: 0.07
Se generó N3: 0.006
Se generó N4: 0.0005
Se generó N5: 0.00004
Se generó N0: 10
Se generó N1: 0.9
Se generó N2: 0.08
Se generó N3: 0.007
Se generó N4: 0.0006
Se generó N5: 0.00005
Se generó N0: 11
Se generó N1: 1
etc
Como pueden ver, al final se muestra el 1, que fue el 1er número, por lo que no debería mostrarse. Hay números que no se muestran pero eso lo analizaré más adelante. Parece evidente que falla esto:
Código:
      if (Decimales>0) {
         LargoMinimodeDiferencia = Decimales+2;
      } else {
         LargoMinimodeDiferencia = Decimales+1;
      }
      if (String(N-Math.floor(N)).length>=LargoMinimodeDiferencia) {
Yo probé distintas cosas, ni idea ya.

Al escribir eso lo que pensé es que si al número le resto él mismo pero entero, entonces si no tenía decimales el largo del resultado será 1, y sino 3 como mínimo, ya que los números más cortos serían 0.1, 0.2, etc, es decir en el caso de no tener decimales el largo resultante es decimales(0)+1, y en el caso de tenerlos es decimales+2. Si tiene 1 decimal el resultado debería ser 3, si tiene 2 entonces 4, etc.

Pero no funciona.

Ahora al poner más salidas veo esto:
N: 1
N-Math.floor(N): 2.22044604925031e-16
String(N-Math.floor(N)): 2.22044604925031e-16
String(N-Math.floor(N)).length): 20

¿Qué condición puedo poner para que distinga si el número cumple las condiciones o no?

Una posibilidad es compararlo con los números antes generados pero eso parece absurdo porque supongo que debe haber un modo más fácil.

¿Por qué 1-floor(1) resulta un decimal? ¿N no es 1? Pero dice 1. Es el resultado de 0.9+0.1, así que podría ser algo aproximado, pero si dice 1 se supone que es 1. Y si no es 1 ¿qué hago? En este caso serviría redondearlo, pero si tengo 0.09999 y se supone que es 0.1 pero ese es repetido entonces no puedo simplemente redondearlo porque queda en 0 y no quiero ese número sino 0.1 (auque no debe mostrarse en pantalla). ¿Lo multiplico por 10^Decimales antes de redondearlo? No entiendo bien si debo redondearlo siempre o no.

Probablemente lo más sencillo sea trabajar con enteros y en el momento de mostrarlos en pabntalla agregarles 0. y cierta cantidad de 0s delante.

¿Otras ideas, info, etc?


En línea

Tachikomaia


Desconectado Desconectado

Mensajes: 1.460


Hackentifiko!


Ver Perfil
Re: Evitar que muestre números repetidos, problema con decimales.
« Respuesta #1 en: 18 Diciembre 2023, 05:27 am »

Creo que lo solucioné usando enteros como había comentado, los divido por 10^Decimales antes de mostrarse en pantalla:
Código
  1. Escena 1
  2.   actions for fotograma 1
  3.      MaxDecimales = 0;
  4.      N1 = 0;
  5.   actions for fotograma 2
  6.      Decimales = 0;
  7.   actions for fotograma 3
  8.      Nombre = "N"+Decimales;
  9.      // Se le suma 1 al número porque sumarle decimales da errores.
  10.      N = (eval(Nombre)+1);
  11.      // Guardar el valor en la lista correspondiente.
  12.      set (Nombre, N);
  13.      // El valor se convierte a decimales como debe ser.
  14.      Show = N/Math.pow(10, Decimales);
  15.      if (Decimales>0) {
  16.         LargoMinimodeDiferencia = Decimales+2;
  17.      } else {
  18.         LargoMinimodeDiferencia = 1;
  19.      }
  20.      if (String(N-Show).length>=LargoMinimodeDiferencia) {
  21.         // El valor no es repetido, se muestra.
  22.         trace ("Se generó "+Nombre+": "+Show);
  23.      }
  24.   actions for fotograma 4
  25.      if (Decimales<MaxDecimales) {
  26.         Decimales = Decimales+1;
  27.         gotoAndPlay (3);
  28.      } else {
  29.         // Se creará una nueva lista con decimales más pequeños.
  30.         MaxDecimales = MaxDecimales+1;
  31.         set ("N"+MaxDecimales, 0);
  32.         // trace ("Se creó N"+MaxDecimales+": "+MaxDecimales);
  33.         gotoAndPlay (2);
  34.      }

Salida:
Citar
Se generó N0: 1
Se generó N0: 2
Se generó N1: 0.1
Se generó N0: 3
Se generó N1: 0.2
Se generó N2: 0.01
Se generó N0: 4
Se generó N1: 0.3
Se generó N2: 0.02
Se generó N3: 0.001
Se generó N0: 5
Se generó N1: 0.4
Se generó N2: 0.03
Se generó N3: 0.002
Se generó N4: 0.0001
Se generó N0: 6
Se generó N1: 0.5
Se generó N2: 0.04
Se generó N3: 0.003
Se generó N4: 0.0002
Se generó N5: 10e-6
Se generó N0: 7
Se generó N1: 0.6
Se generó N2: 0.05
Se generó N3: 0.004
Se generó N4: 0.0003
Se generó N5: 0.00002
Se generó N6: 1e-6
Se generó N0: 8
Se generó N1: 0.7
Se generó N2: 0.06
Se generó N3: 0.005
Se generó N4: 0.0004
Se generó N5: 0.00003
Se generó N6: 2e-6
Se generó N7: 1e-7
Se generó N0: 9
Se generó N1: 0.8
Se generó N2: 0.07
Se generó N3: 0.006
Se generó N4: 0.0005
Se generó N5: 0.00004
Se generó N6: 3e-6
Se generó N7: 2e-7
Se generó N8: 1e-8
Se generó N0: 10
Se generó N1: 0.9
Se generó N2: 0.08
Se generó N3: 0.007
Se generó N4: 0.0006
Se generó N5: 0.00005
Se generó N6: 4e-6
Se generó N7: 3e-7
Se generó N8: 2e-8
Se generó N9: 1e-9
Se generó N0: 11
Se generó N2: 0.09
Ahí al final N1 con valor 1 no se mostró porque ese valor está repetido. Y así sigue sin mostrar repetidos.

Quizá esto:
Código:
      if (Decimales>0) {
         LargoMinimodeDiferencia = Decimales+2;
      } else {
         LargoMinimodeDiferencia = 1;
      }
      if (String(N-Show).length>=LargoMinimodeDiferencia) {
         // El valor no es repetido, se muestra.
Se pueda simplificar, bueno, quizá muchos aspectos más.

Y en cuanto al error en sí, creo que Flash MIENTE respecto a cuales son los valores que dice tener, el trace puede decir 1 pero no serlo, lo mismo si se pone un texto dinámico, se muestra 1 pero al operarlo luego resulta que no es. Otra explicación no veo...


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Numeros aleatorios no repetidos
.NET (C#, VB.NET, ASP)
sexto 4 6,565 Último mensaje 3 Noviembre 2009, 20:15 pm
por MANULOMM
Como convertir numeros decimales a numeros binario en c++?
Programación C/C++
fco_noh 3 9,269 Último mensaje 31 Agosto 2010, 07:38 am
por do-while
Ordenar de menor a mayor una serie de números en Texbox y evitar repetidos
.NET (C#, VB.NET, ASP)
luis456 3 5,697 Último mensaje 9 Octubre 2013, 18:12 pm
por Eleкtro
Problema con numeros decimales:
Programación C/C++
novato991 4 3,736 Último mensaje 13 Diciembre 2013, 19:30 pm
por novato991
matriz sin numeros repetidos
Programación C/C++
DRinoa 1 8,730 Último mensaje 6 Febrero 2017, 18:01 pm
por dato000
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines