Здравствуйте все!
Обнаружил при тестировании советника в MT5. Откуда берётся такая дробная часть?
Подскажите, что это за фокус и как его победить? Есть какие-то хитрые хитрости при сложении чисел double?
...
Это нормально.
https://www.mql5.com/ru/docs/basis/types/double
Из справочника по ссылке:
"Необходимо помнить, что вещественные числа хранятся в памяти компьютера с некоторой ограниченной точностью в двоичной системе счисления, в то время как общепринятой в использовании является десятичная система счисления. Поэтому многие числа, которые точно записываются в десятичной системе, в двоичной системе можно записать только в виде бесконечной дроби.
Например, числа 0.3 и 0.7 представлены в компьютере бесконечными дробями, в то время как число 0.25 хранится точно, так как представляет из себя степень двойки."
- www.mql5.com
Это нормально.
Сергей, спасибо за ответ.
А что делать-то с этим? Как жЫть?
Хочется, чтобы результат вычислений тоже имел дробную часть не дальше сотых.
Вот, положим, такая конструкция срабатывает:
Alert((float)(3.28*100+81.37*100)/100);
Получается как надо
Alert: 84.65
Лыжи поехали чуть лучше, но всё равно - это сомнительный костыль.
Вот, положим, такая конструкция срабатывает:
Получается как надо
Лыжи поехали чуть лучше, но всё равно - это сомнительный костыль.
нормализуйте до нужного значения функцией NormalizeDouble
DoubleToString(w,2);
Сергей, спасибо за ответ.
А что делать-то с этим? Как жЫть?
Хочется, чтобы результат вычислений тоже имел дробную часть не дальше сотых.
На практике я встречался только с двумя проблемами:
1) Сравнение между собой двух double на равенство.
2) Неудобство визуального восприятия таких странных дробей при выводе, например через Print() или Alert().
Решение как обычно оказалось в справочнике.
Так что жЫть можно ))
Тарас, дорогой Вы мой человек, спасибо! Всё работает :)
Alert(DoubleToString(3.28+81.37,2)); Alert(DoubleToString(102.54-37.3,2)); Alert(DoubleToString(111.25-12.01,2)); Alert(DoubleToString(89.77-6.98,2)); Alert(DoubleToString(-41.25-30.4,2)); Alert(DoubleToString(-69.16-12.08,2)); Alert(DoubleToString(-95.17+28.93,2)); Alert: 84.65 Alert: 65.24 Alert: 99.24 Alert: 82.79 Alert: -71.65 Alert: -81.24 Alert: -66.24
2) Неудобство визуального восприятия таких странных дробей при выводе, например через Print() или Alert().
Да ладно, что в алертах, но и при записи в файл :( что совсем не нужно.
Такие мелочи не имеют глобального международного значения.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте все!
Обнаружил при тестировании советника в MT5. Откуда берётся такая дробная часть?
Подскажите, что это за фокус и как его победить? Есть какие-то хитрые хитрости при сложении чисел double?
выдаёт
Вот ещё (с попытками повлиять на них):
Результат:
И такое странное не только в алертах, но и при записи в файл.
В общем, то ли лыжи не в полном порядке, то ли я не совсем здоров :)
На чём обнаружил:
Впрочем и под Win такой же результат: