Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Forex Trader
114297
Forex Trader  
В функции MathRound нет округления вниз.
Может кто подскажет как отбросить дробную часть числа?
Forex Trader
114297
Forex Trader  
MathFloor
Forex Trader
114297
Forex Trader  
    double d = 9.98;
    int i = d;
Forex Trader
114297
Forex Trader  
NormalizeDouble позволит сохранить тип переменной.
Forex Trader
114297
Forex Trader  
NormalizeDouble позволит сохранить тип переменной.

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

NormalizeDouble округляет

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

NormalizeDouble округляет

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




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


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

Forex Trader
114297
Forex Trader  
И округлить != отбросить дробную часть.

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

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

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