Скачать MetaTrader 5

Как отбросить дробную часть?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Не знаешь, как пользоваться виджетом? Прочитай об этом статью!
Forex Trader
114255
Forex Trader 2006.07.19 11:59 
В функции MathRound нет округления вниз.
Может кто подскажет как отбросить дробную часть числа?
Forex Trader
114255
Forex Trader 2006.07.19 12:01  
MathFloor
Forex Trader
114255
Forex Trader 2006.07.19 13:47  
    double d = 9.98;
    int i = d;
Forex Trader
114255
Forex Trader 2006.07.19 13:52  
NormalizeDouble позволит сохранить тип переменной.
Forex Trader
114255
Forex Trader 2006.07.19 14:07  
NormalizeDouble позволит сохранить тип переменной.

NormalizeDouble округляет
Forex Trader
114255
Forex Trader 2006.07.19 14:22  
NormalizeDouble позволит сохранить тип переменной.

NormalizeDouble округляет

Это просто один из способов.
Округлить число до 0 значащих цифр - и тип переменной не изменится и дробной части не будет.
Forex Trader
114255
Forex Trader 2006.07.19 16:26  
NormalizeDouble позволит сохранить тип переменной.

NormalizeDouble округляет

Это просто один из способов.
Округлить число до 0 значащих цифр - и тип переменной не изменится и дробной части не будет.




Посмотрите на калькулятор. Там есть переключатель округления. Округления бывают разные.
И округлить != отбросить дробную часть.
Forex Trader
114255
Forex Trader 2006.07.19 18:10  
NormalizeDouble позволит сохранить тип переменной.
    double d = 9.98;
    int i = d;
    d = i;


Фишка в том, что эти три строчки кода будут скорее всего скомпилированы в несколько команд математического сопроцессора (fpu) и будут выполнены на порядок быстрее, чем MathFloor, и на порядки быстрее, чем NormalizeDouble.

Forex Trader
114255
Forex Trader 2006.07.20 22:52  
И округлить != отбросить дробную часть.

Нет, конечно. Но Вы же вроде хотели "округление вниз". Вот я и предложил.
А калькулятор - это такая чёрная штука с кнопками?:)

Фишка в том, что эти три строчки кода будут скорее всего скомпилированы в несколько команд математического сопроцессора (fpu) и будут выполнены на порядок быстрее, чем MathFloor, и на порядки быстрее, чем NormalizeDouble.

Я точно не могу сказать. Но скорее всего Вы правы.
Вместе с тем, важно и другое. Если полученное число в последующем коде нужно будет сравнивать на больше-меньше, то всё равно его придётся нормализовать.
Получается, что выбор способа как всегда зависит от нескольких факторов.
Forex Trader
114255
Forex Trader 2006.07.21 04:42  
Но Вы же вроде хотели "округление вниз". Вот я и предложил.
NormalizeDouble не делает округления вниз. NormalizeDouble делает округление, как заметил Slawa. Просто возьмите и отбросьте дробь из 9.98 с помощью NormalizeDoulbe. Только без хитростей типа вычитания 0.5 перед округлением. Лишние вычисления совершенно ни к чему.
Если полученное число в последующем коде нужно будет сравнивать на больше-меньше, то всё равно его придётся нормализовать.
Получается, что выбор способа как всегда зависит от нескольких факторов.
Сравнение целых чисел и сравнение чисел с плавающей запятой - две очень большие разницы с точки зрения разогрева процессора. И, опять же, далеко не в пользу последних = порядки на некоторых платформах, на arm, например, который вообще не имеет fpu. А arm - это ппк и смартфоны. Да и нормализовать целые числа не надо, куда уж нормальнее. Floating point - это всегда оверхед, при любом раскладе, по сравнению с целочисленной арифметикой.
Кстати, Вы можете предположить, что представляет из себя NormalizeDouble(), так сказать, изнутри, взглянув на DoubleToStrMorePrecision() из libraries\stdlib.mq4
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий