Double vs FLOAT - errore MathFloor poco chiaro - pagina 7

 
Maxim Kuznetsov:
A seconda dei vostri obiettivi, a volte vale la pena di passare ai numeri interi. Risparmia un sacco di nervi :-) Una volta ho avuto un compito, in cui dovevo segnare con precisione molti-molti livelli, all'inizio ho lottato con il doppio, e poi ho convertito tutto in punti interi da 0 e tutto è diventato facile, semplice e senza errori.
È esattamente quello che ho fatto. L'ho convertito in numeri interi.
 
Vladimir:

Non è necessario usare l'arrotondamento a meno che il compito non lo richieda.


Questo è il punto: i compiti sono diversi :-)

 

Se usateMathFloor o MathCeil per l'arrotondamento, dovete normalizzare il risultato originale alla precisione corretta.

Perché durante il calcolo, invece di un numero intero, si può ottenere un numero frazionario, e a causa di questa "coda" del numero viene arrotondato in modo errato, il risultato è errato.
Per esempio:

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

ora proviamo ad arrotondare conMathFloor

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

Se normalizzo il numero a 1.05 - si normalizzerà a 1.1, che in linea di principionon èquello di cui ho bisogno usandoMathFloor :-)

Perché non usereiaffatto MathFloor.

Ma il problema è diverso.

 

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

Perché è diverso? Hai detto che hai bisogno di arrotondare per difetto - MathFloor fa esattamente questo

 
Taras Slobodyanik:

Perché è diverso? Hai detto che hai bisogno di arrotondare per difetto - questo è ciò che fa MathFloor.

Sì!!! ma se faccio una normalizzazione arrotonderà i conti per difetto eMathFloor non avrà senso

 

l'esempio precedente con il numero 1156.12, questo numero è memorizzato come 1156.11999999999999891

Cioè, se si prova ad arrotondare al centesimo, si ottiene 1156,11 invece di 1156,12, che è la "particolarità" che vi ha fatto scervellare.

 
Taras Slobodyanik:

l'esempio precedente con il numero 1156.12, questo numero è memorizzato come 1156.11999999999999891

cioè, se cercate di arrotondare al centesimo, otterrete 1156,11 invece di 1156,12 - questa è la "particolarità" del vostro problema.

Sì :-) Grazie.

Motivazione: