Maxim Kuznetsov: В зависимости от целей, иногда стоит вообще переходить в целые числа. Сильно бережёт нервы :-) Как-то была задача где надо было точно разметить много-много уровней, сначала умуторился с double, а потом перевёл всё в целые пункты с 0 и всё стало легко,просто и без ошибок.
Если вы, для округления, используете MathFloorили MathCeil, то необходимо нормализовать исходный результат до нужной точности.
Потому что при вычислении, вместо целого числа, может получиться дробное число, и из-за этого "хвоста" число округляется неправильно, результат получается неправильным. Например:
чуть выше пример с числом 1156.12 это число хранится в памяти как 1156.119999999999891
то есть, если вы, попробуете округлить его вниз по сотым (через конвертацию в целое) , то у вас получится число 1156.11 вместо 1156.12 - это и есть "особенность" из-за которой вы ломали голову.
чуть выше пример с числом 1156.12 это число хранится в памяти как 1156.119999999999891
то есть, если вы, попробуете округлить его вниз по сотым (через конвертацию в целое) , то у вас получится число 1156.11 вместо 1156.12 - это и есть "особенность" из-за которой вы ломали голову.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
В зависимости от целей, иногда стоит вообще переходить в целые числа. Сильно бережёт нервы :-) Как-то была задача где надо было точно разметить много-много уровней, сначала умуторился с double, а потом перевёл всё в целые пункты с 0 и всё стало легко,просто и без ошибок.
Не надо использовать округление, пока задача этот не требует.
в том то и дело, что задачи бывают разные :-)
Если вы, для округления, используете MathFloor или MathCeil, то необходимо нормализовать исходный результат до нужной точности.
Потому что при вычислении, вместо целого числа, может получиться дробное число, и из-за этого "хвоста" число округляется неправильно, результат получается неправильным.
Например:
Print (DoubleToStr(1156.12/point, 15));
Print (NormalizeDouble(1156.12/point, _Digits));
теперь попробуем округлить с помощью MathFloor
Print (DoubleToStr(MathFloor(1156.12/point), 15));
Print (MathFloor(NormalizeDouble(1156.12/point, _Digits)));
если я нормализую число 1,05 - нормализуется до 1,1 что в принципе функцией MathFloor - вернет не то что мне нужно :-)
Ибо я бы не использовал MathFloor вообще.
Но задача то другая.
Но задача то другая.
почему другая? вы жеж написали вам нужно округлять результат в меньшую сторону - MathFloor именно это и делает
почему другая? вы жеж написали вам нужно округлять результат в меньшую сторону - MathFloor именно это и делает
да!!! но если я сделаю нормализацию, то оно округлит по математике, и MathFloor уже не будет иметь смысл
чуть выше пример с числом 1156.12 это число хранится в памяти как 1156.119999999999891
то есть, если вы, попробуете округлить его вниз по сотым (через конвертацию в целое) , то у вас получится число 1156.11 вместо 1156.12 - это и есть "особенность" из-за которой вы ломали голову.
чуть выше пример с числом 1156.12 это число хранится в памяти как 1156.119999999999891
то есть, если вы, попробуете округлить его вниз по сотым (через конвертацию в целое) , то у вас получится число 1156.11 вместо 1156.12 - это и есть "особенность" из-за которой вы ломали голову.
да :-) Спасибо.