Quiero comparar 2 dobles pero sin todos los dígitos. por ejemplo tengo este doble 1.548799778 y este 1.547990978 y quiero comparar 1.xx de cada uno. ¿Cómo puedo "redondear" este doble a 1.xx? Gracias Comparar 2 dobles pero sin todos los dígitos en C
Respuesta
para comparar que x
y y
son lo suficientemente cerca, algo así como
(x==0.0 && y==0.0) || fabs(x-y)/max(fabs(x),fabs(y))<1e-6
para redondear x
uso floor(x)
o ceil(x)
como se sugiere por Jan Vorcak
Addenda : No estoy seguro de que va a trabajar para NaN (los detalles dan dolor de cabeza)
En lugar de "x == 0 && y == 0" usaría simplemente "x == y", es más rápido si los dos números son iguales. –
Una técnica va a utilizar la función trunc
así:
double d1, d2;
d1 = 1.548799778;
d2 = 1.547990978;
if (trunc(d1*100) == trunc(d2*100)) {
// do your thing
}
Usando 100
porque quiere dos cifras decimales. Puede usar otros números si quiere más o menos decimales.
Otra posibilidad es simplemente usar una comparación con la tolerancia.
if (fabs(a - b) <= tolerance) { .... }
elija su tolerancia en cuanto a la precisión que desee.
Por ejemplo, puede elegir tolerancia para ser 0.001 para usar sobre los primeros 2 dígitos.
podría no funcionar muy bien si tanto 'a' como' b' son números pequeños, como '1e- 6' y '2e-6' con tolerancia siendo' 1e-5'. Vea mi respuesta para una mejor sugerencia. –
Sí, esto usa tolerancia absoluta y su método usa tolerancia relativa, pero el problema expuesto es solucionable usando solo este método, solo quiere un número pequeño de dígitos, parece 2, por lo que en este caso, este método debe ser suficiente. –
Lo siguiente puede tener el tiempo de ejecución más rápido, y es útil como una comparación general de variables de coma flotante.
if ( x-y < 0.01 && x-y > -0.01)
puede utilizar Math.h
funciones
double check(double number)
{
if (modf(number, 0) >= .5)
return number >= 0 ? ceil(number) : floor(number);
else
return number < 0 ? ceil(number) : floor(number);
}
double round(double number, unsigned int places)
{
double off = pow(10, places);
return check(number * off)/off;
}
if(round(1.548799778, 2) == round(1.547990978, 2))
{
}
este debe ser considerablemente más rápido y configurable si es necesario. no se introduce herencia adicional
int compare(double a, double b)
{
static const double PRECISION = 0.0001;
if (a < b)
return b - a < PRECISION ? 0 : 1;
else
return a - b < PRECISION ? 0 : -1;
}
- 1. C# - Lista - eliminar todos los elementos pero NO los primeros
- 2. Iterar sobre todos los valores dobles posibles
- 3. ¿Cómo comparar dos valores dobles en Java?
- 4. Dobles redondos en Objective-C
- 5. JS regex: reemplazar todos los dígitos en la cadena
- 6. Comparar 2 JSON objetos
- 7. cómo comparar 2 XML usando LINQ en C#
- 8. ¿Cómo comparar esa secuencia de dobles son todos "aproximadamente iguales" en Java?
- 9. sin detener todos los hilos en gdb
- 10. Doctrine 2 - Obtener todos los registros
- 11. ¿Expresión regular para cadena de dígitos sin dígitos repetidos?
- 12. Devolver los 2 últimos dígitos de un número
- 13. Cómo comparar 2 objetos por la igualdad en Objective-C
- 14. pérdida de dígitos cuando los flotadores en división C++ (Arduino)
- 15. ¿Los dobles son más rápidos que los flotadores en C#?
- 16. mejor manera de conseguir todos los dígitos de una cadena
- 17. Comparar cadena con todos los valores en el conjunto
- 18. Comparando valores dobles en C#
- 19. Cómo comparar 2 cadenas que contienen los mismos caracteres
- 20. Cómo comparar 2 objetivos Xcode
- 21. jQuery: pero ¿y todos los niños?
- 22. Cómo comparar 2 cadenas alfabéticamente
- 23. MYSQL obtener todos los resultados pero primero
- 24. cómo puedo comparar 2 funciones en javascript
- 25. cómo comparar 2 json en python
- 26. Sin dígitos Java Regex Pattern
- 27. Comparar colores RGB en C#
- 28. Regex.Match consonantes dobles en C#
- 29. Agregue coma a los números cada tres dígitos con C#
- 30. Byte a cadena binaria C# - Mostrar los 8 dígitos
¿Qué tipo de redondeo quieres? por ejemplo, redondeo o redondeo hacia abajo? –
@AdrienPlisson: borré mi publicación ... gracias por tus explicaciones – Zakaria
¿Quieres redondear o quieres trunc? –