Double vs FLOAT - непонятная ошибка MathFloor - страница 7

 
Maxim Kuznetsov:
В зависимости от целей, иногда стоит вообще переходить в целые числа. Сильно бережёт нервы :-) Как-то была задача где надо было точно разметить много-много уровней, сначала умуторился с double, а потом перевёл всё в целые пункты с 0 и всё стало легко,просто и без ошибок.
Именно так я и делал. Переводил в целые. 
 
Vladimir:

 Не надо использовать округление, пока задача этот не требует.


 в том то и дело, что задачи бывают разные :-)  

 

Если вы, для округления, используете MathFloor или MathCeil, то необходимо нормализовать исходный результат до нужной точности.

Потому что при вычислении, вместо целого числа, может получиться дробное число, и из-за этого "хвоста" число округляется неправильно, результат получается неправильным.
Например:

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

теперь попробуем округлить с помощью MathFloor 

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

если я нормализую число 1,05 - нормализуется до 1,1 что в принципе функцией MathFloor - вернет не то что мне нужно :-)

Ибо я бы не использовал MathFloor вообще.

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

 

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

 почему другая? вы жеж написали вам нужно округлять результат в меньшую сторону - MathFloor именно это и делает

 
Taras Slobodyanik:

 почему другая? вы жеж написали вам нужно округлять результат в меньшую сторону - MathFloor именно это и делает

да!!! но если я сделаю нормализацию, то оно округлит по математике, и  MathFloor уже не будет иметь смысл

 

чуть выше пример с числом 1156.12 это число хранится в памяти как 1156.119999999999891

то есть, если вы, попробуете округлить его вниз по сотым (через конвертацию в целое) , то у вас получится число 1156.11 вместо 1156.12 - это и есть "особенность" из-за которой вы ломали голову.

 
Taras Slobodyanik:

чуть выше пример с числом 1156.12 это число хранится в памяти как 1156.119999999999891

то есть, если вы, попробуете округлить его вниз по сотым (через конвертацию в целое) , то у вас получится число 1156.11 вместо 1156.12 - это и есть "особенность" из-за которой вы ломали голову.

да :-) Спасибо.  

Причина обращения: