Setprecision es confuso

Solo quiero preguntar sobre setprecision porque estoy un poco confundido.

Aquí está el código:

#include  #include  using namespace std; int main() { double rate = x; cout << fixed << setprecision(2) << rate; } 

donde x = a siguiente:

El lado izquierdo de la ecuación son los valores de x.

1.105 = 1.10 debe ser 1.11

1.115 = 1.11 debe ser 1.12

1.125 = 1.12 debe ser 1.13

1.135 = 1.14 que es correcto

1.145 = 1.15 también correcto

pero si x es:

2.115 = 2.12 que es correcto

2.125 = 2.12 debe ser 2.13

Entonces, ¿por qué en cierto valor es correcto pero a veces es incorrecto?

por favor iluminame. Gracias

No hay ninguna razón para esperar que cualquiera de las constantes en tu publicación se pueda representar exactamente usando el sistema de punto flotante. Como consecuencia, es posible que las mitades exactas que ya tiene no sean las mitades exactas una vez que las almacene en una variable double (independientemente de la forma en que se supone que los flujos de imágenes redondean dichos números).

El siguiente código ilustra mi punto:

 #include  #include  using namespace std; int main() { double rate = 1.115; cout << fixed << setprecision(20) << rate; } 

Salida:

 1.11499999999999999112 

Recomendaría echar un vistazo a las preguntas frecuentes .

Es posible que algunos de los números que está imprimiendo no se puedan representar como un número de punto flotante y que en realidad sean más bajos o más altos de lo que cree, lo que afecta directamente al redondeo.

Ya que está tratando de dar formato a un número de punto flotante a punto fijo, ¿ha considerado realmente USAR un número de punto fijo (int / largo escala por ejemplo 1000 dependiendo de sus necesidades) que tiene su propio operador de inserción definido? Entonces siempre obtendrá una visualización y un redondeo precisos sin necesidad de confiar en que setprecision tenga algún comportamiento en particular (no pude encontrar la sección de conversión relevante en el estándar de forma rápida).

¿Por qué dices que 1.105 debería ser 1.11? El estándar de C ++ no dice nada al respecto, pero el modo de redondeo predeterminado en la mayoría de las máquinas habituales (Intel, Sparc, etc.) es de un valor parejo, por lo que 1.105 debería ser 1.10. En general, cuando el resultado exacto es exactamente entre dos valores representables, la regla es redondear a uno con un dígito aún menos significativo.

También me pregunto de dónde sacas estos valores. En las máquinas habituales, 1.105 no se puede representar, por lo que tiene algo un poco más grande o un poco más pequeño.

Y, por supuesto, los comentarios anteriores se aplican a todos los demás valores que ha citado.