Resta de doubles devuelve 1.13687e-13
-
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?
-
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
-
@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);
-
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
-
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.htmlSigo 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?