Double vs FLOAT - error MathFloor poco claro - página 7

 
Maxim Kuznetsov:
Dependiendo de tus objetivos, a veces merece la pena pasar a los números enteros por completo. Ahorra muchos nervios :-) Una vez tuve una tarea en la que tenía que marcar con precisión muchos niveles, al principio me costó el doble, y luego convertí todo a puntos enteros desde 0 y todo se volvió fácil, sencillo y sin errores.
Eso es exactamente lo que hice. Lo he convertido en enteros.
 
Vladimir:

No es necesario utilizar el redondeo a menos que la tarea lo requiera.


Esa es la cuestión: las tareas son diferentes :-)

 

Si utilizaMathFloor o MathCeil para el redondeo, debe normalizar el resultado original con la precisión correcta.

Porque durante el cálculo, en lugar de un número entero, puede obtener un número fraccionario, y debido a esta "cola" del número se redondea incorrectamente, el resultado es incorrecto.
Por ejemplo:

double point=0.01;
Print (DoubleToStr(1156.12/point, 15));
Print (NormalizeDouble(1156.12/point, _Digits));

ahora vamos a intentar redondear conMathFloor

double point=0.01;
Print (DoubleToStr(MathFloor(1156.12/point), 15));
Print (MathFloor(NormalizeDouble(1156.12/point, _Digits)));
 

Si normalizo el número a 1,05 - se normalizará a 1,1, que en principiono eslo que necesito usandoMathFloor :-)

Pues yo no utilizaríaMathFloor en absoluto.

Pero el problema es diferente.

 

Но задача то другая.  

¿Por qué es diferente? Usted dijo que necesitaba redondear hacia abajo - MathFloor hace exactamente eso

 
Taras Slobodyanik:

¿Por qué es diferente? Dijiste que necesitabas redondear hacia abajo - eso es lo que hace MathFloor.

si!!! pero si hago una normalización redondeará las matemáticas hacia abajo yMathFloor no tendrá sentido

 

el ejemplo anterior con el número 1156.12, este número se almacena en la memoria como 1156.1199999999891

Es decir, si intentas redondear a la centésima, obtienes 1156,11 en lugar de 1156,12, que es la "peculiaridad" que te hizo devanarte los sesos.

 
Taras Slobodyanik:

el ejemplo anterior con el número 1156.12, este número se almacena en la memoria como 1156.1199999999891

Es decir, si intentas redondear a la centésima, obtendrás 1156,11 en lugar de 1156,12 - esta es la "peculiaridad" de tu problema.

Sí :-) Gracias.