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
Forum Update on Monday, May 27th 2025

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.
  • JoanJinglesJ Offline
    JoanJinglesJ Offline
    JoanJingles
    wrote on 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
    • juankiJ Offline
      juankiJ Offline
      juanki
      Moderators
      wrote on 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'.

      JoanJinglesJ 1 Reply Last reply
      0
      • juankiJ juanki

        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

        JoanJinglesJ Offline
        JoanJinglesJ Offline
        JoanJingles
        wrote on 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);
        
        juankiJ 1 Reply Last reply
        0
        • JoanJinglesJ JoanJingles

          @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);
          
          juankiJ Offline
          juankiJ Offline
          juanki
          Moderators
          wrote on 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'.

          JoanJinglesJ 1 Reply Last reply
          1
          • juankiJ juanki

            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

            JoanJinglesJ Offline
            JoanJinglesJ Offline
            JoanJingles
            wrote on 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