Округление чисел в МТ4 через NormalizeDouble - страница 13

 
Алексей Тарабанов:
Бес попутал... 2.6, конечно. 
все, спать пора 
 
lilita bogachkova:
все, спать пора 
Присоединяюсь
 
Dmitry Fedoseev:
Чего 5? При нормализации такого числа все 9-ки превращаются в нули, поэтому нормализовать, а потом отбросить будет давать неправильные результаты.
DoubleToString(0.99999,5)
 
Vasyl Nosal:
DoubleToString(0.99999,5)

Дык, а если число 0.99999, а оставить надо два знака? Отбросить остальное. Нужно получить 0.99. Значит по предложенному ранее алгоритму нормализуем до трех знаков, получаем 1.000, отбрасываем один и получаем 1.00, но не 0.99.  

 
Dmitry Fedoseev:

Дык, а если число 0.99999, а оставить надо два знака? Отбросить остальное. Нужно получить 0.99. Значит по предложенному ранее алгоритму нормализуем до трех знаков, получаем 1.000, отбрасываем один и получаем 1.00, но не 0.99.  

extern ushort Characters_delete = 3;

///////////////////////////////////////////
string data=DoubleToString(0.99999,5); 
string resoult=StringSubstr(data,0,StringLen(data)-Characters_delete);
 
Vasyl Nosal:
Ага... а у нас раз и вдруг вместо  0.99999 оказалось число 0.999999.
 
Dmitry Fedoseev:
Ага... а у нас раз и вдруг вместо  0.99999 оказалось число 0.999999.
string(0.999999)
 
Напомнило анекдот про пропавшего программиста. А он сидит в холодной ванне, в руках шампунь с инструкцией "намылить смыть, повторить".
 
Dmitry Fedoseev:
Напомнило анекдот про пропавшего программиста. А он сидит в холодной ванне, в руках шампунь с инструкцией "намылить смыть, повторить".
 Зачем в языке нужна такая точность: что число (например) "0.7" реально хранится как "0.69999..."?
Это реально где-то используется? Я привык считать цифры как в калькуляторе, там точно показывается. 
Да, возможно, калькулятор и сам что-то свое округляет, и сам не хранит точные цифры... 
Кому вообще нужно использовать такие приблеженные цифры ссбесконечной дробью вместо точных значений?
Поделили, получили 0.7, и не парится с обрезанием или округлением :-)
 
Dmitry Fedoseev:

Дык, а если число 0.99999, а оставить надо два знака? Отбросить остальное. Нужно получить 0.99. Значит по предложенному ранее алгоритму нормализуем до трех знаков, получаем 1.000, отбрасываем один и получаем 1.00, но не 0.99.  

попробуйте получить результат 0.99999999999999999

X = 0.99999999999999999

10*X = 10*0.99999999999999999 

10*X-X = 10*0.99999999999999999-0.99999999999999999

9*X = 9*0.99999999999999999

получим 9*X = 9 или X равен 1 (один) 

void OnStart()
  {
      double v1=1.0/3.0;
      double v2=3.0*v1;

      Print("v1 = (1/3) = ",DoubleToString(v1)," | ","v2 = 3*(1/3) = ",DoubleToString(v2));
  }

 v1 = (1/3) = 0.33333333 | v2 = 3*(1/3) = 1.00000000

 

или  0.99999999999999999 = 1.0

void OnStart()
  {
      double v1=0.99999999999999999;

      if(v1>=1.0)
         Print("v1 (",DoubleToString(v1),") >= 1.0");
  }

 v1 (1.00000000) >= 1.0

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