Не отображаются правильно цифры NormalizeDouble DoubleToString

 

Вопрос: Возможно ли не точное отображение в тексте на графике, цифр или это не возможно и нужно искать ошибку в коде.

Есть код:   

p=NormalizeDouble( NormalizeDouble(priceOpen,Digits)-NormalizeDouble(price,Digits),Digits) /_Point;

Здесь проверка показывает что p == 13     

Далее создается текст и в него заносится  результат p. 

string text =DoubleToString(p,0);

текст создается такой 

  ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);

При отображении на графике результата p = отображает 12;  Что интересно не всегда некорректно отображает то правильно то не правильно.

 
Igor Petrov:

Вопрос: Возможно ли не точное отображение в тексте на графике, цифр или это не возможно и нужно искать ошибку в коде.

Есть код:   

Здесь проверка показывает что p == 13     

Далее создается текст и в него заносится  результат p. 

текст создается такой 

При отображении на графике результата p = отображает 12;  

Зачем столько нормализаций?

p=(priceOpen-price) /_Point;

ObjectSetString(chart_ID,name,OBJPROP_TEXT,DoubleToString(p,0));
 
Vitaly Muzichenko #:

Зачем столько нормализаций?

  Согласен, но искал решение  проблемы добавлял уже как можно и так и так проблема не решается. Изначально была одна нормализация. 

Кстати, там тоже была проблема при расчетах не нормализованных чисел, и несколько нормализаций исправило проблему.
 

Рациональные числа, которые не могут быть представлены в виде дроби со знаменателем, являющимся степенью двойки, не могут быть точно представлены в виде конечной двоичной дроби, а, значит, не могут быть в точности представлены в памяти компьютера. 

https://server.179.ru/tasks/cpp/total/131.html

 
Taras Slobodyanik #:

Рациональные числа, которые не могут быть представлены в виде дроби со знаменателем, являющимся степенью двойки, не могут быть точно представлены в виде конечной двоичной дроби, а, значит, не могут быть в точности представлены в памяти компьютера. 

https://server.179.ru/tasks/cpp/total/131.html

Спасибо да согласен, в принципе я понял что не все числа дробные могут быть представлены.   Но я хотел бы знать точно, почему  при результате в моем пример p = 13 (вроде как уже целое число). В результате в текст выводиться 12. Значил ли это что результат не гарантирован в точности? при выводе в текст. Спасибо за помощь.

DoubleToString(p,0)


 
Igor Petrov #:

Значил ли это что результат не гарантирован в точности? при выводе в текст.

Число́ двойно́й то́чности (Double precisionDouble) — компьютерный формат представления числа с плавающей запятой, занимающий в памяти 64 бита, или 8 байт. Как правило, обозначает числа с плавающей запятой стандарта IEEE 754.

https://ru.wikipedia.org/wiki/Число_двойной_точности


Для печати, какую точность задаете, такую и выводит.
DoubleToString(p,0) - это нулевая точность.

Если нужно округлить дробь до целого то есть соответствующие команды MathRound, MathFloor, MathCeil.
 
 Для печати, какую точность задаете, такую и выводит.

DoubleToString(p,0) - это нулевая точность.

Наверное я не правильно объяснил. В данном примере в результате вычеслений получаеться цыфра 13 она правильная, большая точность не нужна. Но в текст выводиться не 13 а 12. Почему цифра меняется? 

 
Igor Petrov #:

Наверное я не правильно объяснил. В данном примере в результате вычеслений получаеться цыфра 13 она правильная, большая точность не нужна. Но в текст выводиться не 13 а 12. Почему цифра меняется? 

если бы вы указали точность не 0, то наверняка увидели бы цифру 12,99999999999, что по сути является цифрой 13

Делать сравнения с точной цифрой не имеет смысла, потому что либо цена перепрыгнет эту цифру, либо это окажется дробное число.
При сравнении нужно делать >= или <=.

 
Igor Petrov #:

Наверное я не правильно объяснил. В данном примере в результате вычеслений получаеться цыфра 13 она правильная, большая точность не нужна. Но в текст выводиться не 13 а 12. Почему цифра меняется? 

Округление до целого и целая часть разные вещи. В текст выводится целая часть числа, а результат это округление до целого.
 
Нормализуйте (р+0.5) и будет Вам счастье. Там просто дробная часть отсекается.