Как понять такие числа? 0.07 == 0.07000000000000001 - страница 2

 
abolk:

ну, нет же -- повводили double, int -- мудохаются и разработчики и пользователи с этим double, с точностью, с нормализацией.

Я не против разных типов, так правильней. Просто не понятно, почему "0.07" = "0.07000...01". Просто зачем так? Мне как обычному, не машине, человеку не ясен смысл (документацию сейчас изучу дополнительно в поисках высшего смысла)... Почему бы не использовать точные (целые или дробные) значения, зачем эти точности_точности? 
 
WePlexus:
Я не против разных типов, так правильней. Просто не понятно, почему "0.07" = "0.07000...01". Просто зачем так? Мне как обычному, не машине, человеку не ясен смысл (документацию сейчас изучу дополнительно в поисках высшего смысла)... Почему бы не использовать точные (целые или дробные) значения, зачем эти точности_точности? 

так написали же разработчики в документации пояснение [https://www.mql5.com/ru/docs/basis/types/double]:

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

-- если пока непонятно -- то примите это как факт -- с опытом разберётесь и с практикой научитесь корректно с этим работать
 
C-4:

рез DoubleToString. Если нужна нормализация то NormalizeDouble.

В том то и беда, что эти 2 функции дают "Не точные" результаты, хоть вывод на экран, хоть нормализация. Одно выводит с точным окончанием "0000000001", другое приплюсовывает к числу "0.0020" или еще что-то. Но не то, что нужно.

Это, знаете, как мы пишем "5 + 3 = 8", а на самом деле оно является "+5 + +3 = +8". Была бы настройка компилятора "Точные, Не точные величины"...

 
abolk:

так написали же разработчики в документации пояснение [https://www.mql5.com/ru/docs/basis/types/double]:

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

-- если пока непонятно -- то примите это как факт -- с опытом разберётесь и с практикой научитесь корректно с этим работать
Окей... Постараюсь принять. Тогда объясните, почему не помогает ни одна из придложенных функций, чтобы ВСЕ-ТАКИ привести дробное число к точному (как в калькуляторе) значению? Обе фушкции приведения значений не справляются с выводом корректных значений. Вернее, получается справиться только путем записывания информации в тип string.
 
WePlexus:
Я не против разных типов, так правильней. Просто не понятно, почему "0.07" = "0.07000...01". Просто зачем так? Мне как обычному, не машине, человеку не ясен смысл (документацию сейчас изучу дополнительно в поисках высшего смысла)... Почему бы не использовать точные (целые или дробные) значения, зачем эти точности_точности? 
Вы не задумывались почему double типы могут принимать такие большие значения? Потому что в double любое число представляется как основание возведенное в некоторую степень. Например можно число 12 записать как 10^1,07918... Однако второй вариант не строго равен 12. Если бы чисел после запятой было бы больше, то приближение к числу 12 было бы лучше. Поэтому нельзя сравнивать два double числа напрямую. Можно говорить что два double числа равны друг другу в рамках определенной точности.
 
WePlexus:
Окей... Постараюсь принять. Тогда объясните, почему не помогает ни одна из придложенных функций, чтобы ВСЕ-ТАКИ привести дробное число к точному (как в калькуляторе) значению? Обе фушкции приведения значений не справляются с выводом корректных значений. Вернее, получается справиться только путем записывания информации в тип string.

почему не помогает?

функция https://www.mql5.com/ru/docs/convert/normalizedouble прекрасно решает проблему

 
WePlexus:

В том то и беда, что эти 2 функции дают "Не точные" результаты, хоть вывод на экран, хоть нормализация. Одно выводит с точным окончанием "0000000001", другое приплюсовывает к числу "0.0020" или еще что-то. Но не то, что нужно.

Это, знаете, как мы пишем "5 + 3 = 8", а на самом деле оно является "+5 + +3 = +8". Была бы настройка компилятора "Точные, Не точные величины"...

Не может DoubleToString выводить такие значения. Вы ошибку при ее использовании совершили, а потом жалуетесь что "пчелы делают не правильный мед". Конкретно:

double Var = DoubleToString(0.07, 2);
Alert (Var);
// На выходе: 0.07000000000000001

Вы вначале double конвертируете в string. Затем string неявно конвертируете в double и приравниваете ее к Var. А затем Var снова неявно конвертируете в стринг и выводите на печать. При этом предупреждения компилятора о том, что происходит неявное преобразование Вы просто игнорируете:

implicit conversion from 'number' to 'string' TestInclude.mq5 14 11

implicit conversion from 'string' to 'number' TestInclude.mq5 15 15

 
abolk:

так написали же разработчики в документации пояснение [https://www.mql5.com/ru/docs/basis/types/double]:

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

-- если пока непонятно -- то примите это как факт -- с опытом разберётесь и с практикой научитесь корректно с этим работать

Хромой учит слепого.

Болконский, все числа в компьютерах хранятся в двоичной системе счисления. Не пудри новичку мозги!

 
C-4:

Хромой учит слепого.

Болконский, все числа в компьютерах хранятся в двоичной системе счисления. Не пудри новичку мозги!

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

я привёл цитату из документации [https://www.mql5.com/ru/docs/basis/types/double] -- приведу ещё раз:

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

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

p.s. если ты с такой трактовкой не согласен -- то обращайся в сервисдеск

 
abolk:

ты о чём? ...

Ты не ссылайся на доки, а лучше скажи в какой системе счисления хранится integer, а double? Short?

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