Rundung von Zahlen in MT4 über NormalizeDouble - Seite 13

 
Алексей Тарабанов:
Der Teufel steckt in der Mischung... 2.6, natürlich.
Es ist Zeit, ins Bett zu gehen.
 
lilita bogachkova:
Es ist Zeit, ins Bett zu gehen.
Beitritt zu
 
Dmitry Fedoseev:
Was ist 5? Wenn man eine solche Zahl normalisiert, werden alle 9en zu Nullen, so dass das Normalisieren und anschließende Verwerfen zu falschen Ergebnissen führen würde.
DoubleToString(0.99999,5)
 
Vasyl Nosal:
DoubleToString(0.99999,5)

Was ist, wenn die Zahl 0,99999 ist und Sie zwei Ziffern übrig lassen müssen? Werfen Sie den Rest weg. Wir müssen 0,99 erreichen. Wir normalisieren sie also auf drei Stellen, erhalten 1,000, verwerfen eine und erhalten 1,00, aber nicht 0,99.

 
Dmitry Fedoseev:

Was ist, wenn die Zahl 0,99999 ist und Sie zwei Ziffern übrig lassen müssen? Werfen Sie den Rest weg. Wir müssen 0,99 erreichen. Wir normalisieren sie also auf drei Stellen, erhalten 1,000, verwerfen eine und erhalten 1,00, aber nicht 0,99.

extern ushort Characters_delete = 3;

///////////////////////////////////////////
string data=DoubleToString(0.99999,5); 
string resoult=StringSubstr(data,0,StringLen(data)-Characters_delete);
 
Vasyl Nosal:
Ja... und plötzlich haben wir 0,999999 statt 0,999999.
 
Dmitry Fedoseev:
Ja... und plötzlich haben wir die Zahl 0,999999 statt 0,999999.
string(0.999999)
 
Das erinnert mich an die Anekdote über den verschwundenen Programmierer. Und er sitzt in einem kalten Bad, mit Shampoo in der Hand und der Anweisung "einseifen, ausspülen, wiederholen".
 
Dmitry Fedoseev:
Das erinnert mich an einen Witz über einen Programmierer, der verschwunden ist. Er saß in einem kalten Bad, mit Shampoo in der Hand und der Anweisung "einseifen, ausspülen und wiederholen".
Warum braucht eine Sprache eine solche Präzision, dass die Zahl (zum Beispiel) "0,7" tatsächlich als "0,69999..." gespeichert wird?
Wird dies tatsächlich irgendwo verwendet? Ich bin es gewohnt, die Zahlen wie in einem Taschenrechner zu zählen, das zeigt die Genauigkeit.
Ja, vielleicht rundet der Rechner selbst etwas und speichert die genauen Zahlen nicht selbst...
Wer braucht solche Näherungswerte mit unendlichen Brüchen anstelle von exakten Werten?
Teilen Sie es, erhalten Sie 0,7 und machen Sie sich nicht die Mühe, zu beschneiden oder zu runden :-)
 
Dmitry Fedoseev:

Was ist, wenn die Zahl 0,99999 ist und Sie zwei Ziffern übrig lassen müssen? Werfen Sie den Rest weg. Wir müssen 0,99 erreichen. Nach dem oben vorgeschlagenen Algorithmus normalisieren wir also auf drei Ziffern, erhalten 1,000, verwerfen eine und erhalten 1,00, aber nicht 0,99.

versuchen, ein Ergebnis von0,999999999999999 zu erhalten

X = 0.99999999999999999

10*X = 10*0.99999999999999999

10*X-X = 10*0,9999999999999-0,99999999999

9*X = 9*0.99999999999999999

erhalten wir 9*X = 9 oder X ist gleich 1 (eins)

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

oder 0,9999999999999 = 1,0

void OnStart()
  {
      double v1=0.99999999999999999;

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

v1 (1.00000000) >= 1.0

Grund der Beschwerde: