Qt Forum

    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Unsolved

    Update: Forum Guidelines & Code of Conduct

    Unsolved Resta de doubles devuelve 1.13687e-13

    Spanish
    1.13687e-13
    2
    5
    1521
    Loading More Posts
    • 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.
    • JoanJingles
      JoanJingles last edited by

      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 Reply Quote 0
      • juanki
        juanki Moderators last edited by

        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'.

        JoanJingles 1 Reply Last reply Reply Quote 0
        • JoanJingles
          JoanJingles @juanki last edited by

          @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);
          
          juanki 1 Reply Last reply Reply Quote 0
          • juanki
            juanki Moderators @JoanJingles last edited by

            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'.

            JoanJingles 1 Reply Last reply Reply Quote 1
            • JoanJingles
              JoanJingles @juanki last edited by JoanJingles

              @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 Reply Quote 0
              • First post
                Last post