Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Spanish
  4. Resta de doubles devuelve 1.13687e-13

Resta de doubles devuelve 1.13687e-13

Scheduled Pinned Locked Moved Unsolved Spanish
1.13687e-13
5 Posts 2 Posters 1.8k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • J Offline
    J Offline
    JoanJingles
    wrote on 8 Jun 2016, 19:53 last edited by
    #1

    Tengo dos arrays de tipo double iterados en un bucle for. A cada ciclo se realiza una resta entre los dos valores y cuando el resultado debería ser 0 me devuelve 1.13687e-13. ¿Alguna idea de cómo solucionarlo?

    1 Reply Last reply
    0
    • J Offline
      J Offline
      juanki
      Moderators
      wrote on 9 Jun 2016, 17:08 last edited by
      #2

      Hola

      Bueno, sin nada de código lo único que podemos hacer es tratar de adivinar. No sé porqué cuesta tanto poner unas líneas de código...

      Aun así ¿Estás seguro de que debería dar 0? ¿Estás seguro que las variables están inicializadas correctamente? ¿Has probado a ir imprimiendo por consola los números que se va a restar para ver si realmente son los que deberían?......

      Un saludo

      Intenta explicar el problema lo más claro y detallado posible. Adjunta los errores y el código que creas da el error.
      Procura escribir correctamente y sin faltas de ortografía.

      Si la duda se solucionó, por favor, marca el tema como 'solucionado'.

      J 1 Reply Last reply 17 Jun 2016, 11:15
      0
      • J juanki
        9 Jun 2016, 17:08

        Hola

        Bueno, sin nada de código lo único que podemos hacer es tratar de adivinar. No sé porqué cuesta tanto poner unas líneas de código...

        Aun así ¿Estás seguro de que debería dar 0? ¿Estás seguro que las variables están inicializadas correctamente? ¿Has probado a ir imprimiendo por consola los números que se va a restar para ver si realmente son los que deberían?......

        Un saludo

        J Offline
        J Offline
        JoanJingles
        wrote on 17 Jun 2016, 11:15 last edited by
        #3

        @juanki
        Bueno, me gustaría poder compartir ese código completo pero son más de 300 líneas repatidas entre varias funciones de un programa que gestiona una base de datos. Al final, el cálculo se realiza en un simple for que itera tres QList<double>. Ya he usado qDebug()<< ; para ver los valores que se están restando y son valores idénticos, debería dar 0. Me parece que el fallo está en un error de redondeado a dos decimales pero no entiendo por qué si los valores que ingreso son únicamente de dos decimales.

        /*QListB y QListC contienen valores obtenidos de una base de datos QSQLITE. Las tablas están configuradas para contener valores double y estos se extraen iterando un QSqlTableModel*/
        
        QList<double> QListA;
        
        for (int c = 0; c<12; c++) 
        {
                        //esta resta, aveces devuelve "1.13687e-13" en lugar de "0"
                        QListA.insert(c, QListB.at(c) - QListC.at(c));
        }
        

        Lo he resuelto temporalmente aplicando este if a modo de parche

        if ((QListA.at(c) <= 0.004) && (QListA.at(c)>= -0.004)) //parche para cubrir el error de cálculo
                            QListA.insert(c, 0);
        
        J 1 Reply Last reply 18 Jun 2016, 17:58
        0
        • J JoanJingles
          17 Jun 2016, 11:15

          @juanki
          Bueno, me gustaría poder compartir ese código completo pero son más de 300 líneas repatidas entre varias funciones de un programa que gestiona una base de datos. Al final, el cálculo se realiza en un simple for que itera tres QList<double>. Ya he usado qDebug()<< ; para ver los valores que se están restando y son valores idénticos, debería dar 0. Me parece que el fallo está en un error de redondeado a dos decimales pero no entiendo por qué si los valores que ingreso son únicamente de dos decimales.

          /*QListB y QListC contienen valores obtenidos de una base de datos QSQLITE. Las tablas están configuradas para contener valores double y estos se extraen iterando un QSqlTableModel*/
          
          QList<double> QListA;
          
          for (int c = 0; c<12; c++) 
          {
                          //esta resta, aveces devuelve "1.13687e-13" en lugar de "0"
                          QListA.insert(c, QListB.at(c) - QListC.at(c));
          }
          

          Lo he resuelto temporalmente aplicando este if a modo de parche

          if ((QListA.at(c) <= 0.004) && (QListA.at(c)>= -0.004)) //parche para cubrir el error de cálculo
                              QListA.insert(c, 0);
          
          J Offline
          J Offline
          juanki
          Moderators
          wrote on 18 Jun 2016, 17:58 last edited by
          #4

          Hola @JoanJingles

          Si trabajas con double debes saber que, debido a la forma en que se almacena en memoria, el número no es exacto, busca por ahí que te lo explicarán mejor de lo que pueda hacerlo yo (soy malísimo explicando XD).

          Por eso no te dará la suma exacta de cero.

          Un saludo

          Intenta explicar el problema lo más claro y detallado posible. Adjunta los errores y el código que creas da el error.
          Procura escribir correctamente y sin faltas de ortografía.

          Si la duda se solucionó, por favor, marca el tema como 'solucionado'.

          J 1 Reply Last reply 19 Jun 2016, 12:24
          1
          • J juanki
            18 Jun 2016, 17:58

            Hola @JoanJingles

            Si trabajas con double debes saber que, debido a la forma en que se almacena en memoria, el número no es exacto, busca por ahí que te lo explicarán mejor de lo que pueda hacerlo yo (soy malísimo explicando XD).

            Por eso no te dará la suma exacta de cero.

            Un saludo

            J Offline
            J Offline
            JoanJingles
            wrote on 19 Jun 2016, 12:24 last edited by JoanJingles
            #5

            @juanki

            Parece que he encontrado una explicación al problema: http://www.javamexico.org/blogs/luxspes/por_que_usar_bigdecimal_y_no_double_para_calculos_aritmeticos_financieros

            Por ahora lo resuelvo así:

            QListA.insert(c, QString::number(QListB.at(c) - QListC.at(c), 'f', 2).toDouble());
            

            Utilizo QString para forzar los decimales y redondear.
            Encontré esta solución aquí: http://www.qtforum.org/article/29565/output-a-double-to-only-2-decimal-points.html

            Sigo sin estar seguro si esta es la mejor manera de hacer un cálculo monetario de precisión. ¿Hay alguna otra manera de hacer esta operación sin margen de error?

            1 Reply Last reply
            0

            • Login

            • Login or register to search.
            • First post
              Last post
            0
            • Categories
            • Recent
            • Tags
            • Popular
            • Users
            • Groups
            • Search
            • Get Qt Extensions
            • Unsolved