NormalizeDouble을 사용하여 MT4에서 숫자 반올림 - 페이지 13

 
Алексей Тарабанов :
악마는 속았다 ... 2.6, 물론.
여러분, 잘 시간입니다
 
lilita bogachkova :
여러분, 잘 시간입니다
나는 가입한다
 
Dmitry Fedoseev :
5는 무엇입니까? 이러한 숫자를 정규화하면 9가 모두 0으로 바뀌므로 정규화한 다음 버리면 잘못된 결과가 나타납니다.
DoubleToString (0.99999.5)
 
Vasyl Nosal :
DoubleToString(0.99999.5)

닥, 그리고 만약 숫자가 0.99999라면 2글자를 남겨야겠죠? 나머지는 버리십시오. 0.99를 받아야 합니다. 그래서 앞서 제안한 알고리즘에 따라 세 자리 숫자로 정규화하고 1.000을 얻고 하나를 버리고 1.00을 얻습니다. 그러나 0.99는 아닙니다.

 
Dmitry Fedoseev :

닥, 그리고 만약 숫자가 0.99999라면 2글자를 남겨야겠죠? 나머지는 버리십시오. 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라면 2글자를 남겨야겠죠? 나머지는 버리십시오. 0.99를 받아야 합니다. 그래서 앞서 제안한 알고리즘에 따라 세 자리 숫자로 정규화하고 1.000을 얻고 하나를 버리고 1.00을 얻습니다. 그러나 0.99는 아닙니다.

결과를 얻으 십시오 0.99999999999999999

X = 0.99999999999999999

10*X = 10*0.99999999999999999

10*XX = 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