Frage

Ich versuche, eine bestimmte Zeichenfolge mit Ziffern so zu ändern, dass sie wie folgt aussieht.

Geändert, um mit Ziffern anstelle von X angezeigt zu werden.

Also lasst uns einstellen, ich bekomme eine Zahl wie diese.

234.123123123

Ich muss ändern, wie es aussieht, denn 3 Ziffern vor einem Punkt müssten so werden.

0.234123123123

Nehmen wir an, es wäre 2,23123123123, das würde 0,0023123123123 ergeben

Jetzt werde ich versuchen, die Formel ohne mein Englisch zu erklären.

Die Formel muss die Position des Punkts „.“ ändern.Sie können sehen, dass es die Stelle wechselt, aber Sie können auch sehen, dass ich Nullen hinzufüge.

Das ist wichtig, die Nullen müssen hinzugefügt werden, WENN der Punkt ganz links (am Anfang der Zeichenfolge) landet.

Wie weit muss sich der Punkt also bewegen?

Der Punkt muss sich immer 3 Schritte nach links bewegen.

Und wenn es die Wand (den Anfang der Zeichenfolge) trifft, müssen Sie Nullen und dann eine Null vor dem Punkt hinzufügen.

Wenn die Zahl lautet, muss ich den Punkt zuerst den Punkt nach links bewegen, und zeigen Sie uns Schritt für Schritt an.

Step 1:
.2222222

Step 2:
.02222222

Step 3:
0.02222222

Es muss immer eine 0 vor dem Punkt sein, wenn es jemals den Start erreicht hat.

Es klingt komplizierter als es ist, ich weiß nur nicht, wie ich es erklären soll.

BEARBEITEN:

Mein Versuch:

      TextPos = InStr(1, TextBox4.Value, ".") - 2
If (TextPos = 4) Then
     sLeft = Left(TextBox4.Value, Len(TextBox4.Value) - Len(TextBox4.Value) + 2)
      sRight = Right(TextBox4.Value, Len(TextBox4.Value) - 2)
      sFinal = (sLeft & "." & Replace(sRight, ".", ""))
      TextBox4.Value = Replace(sFinal, "-", "")
      End If
If (TextPos = 3) Then
      TextBox4.Value = "0." + Replace(TextBox4.Value, ".", "")
      End If
If (TextPos = 2) Then
      TextBox4.Value = "0.0" + Replace(TextBox4.Value, ".", "")
End If
If (TextPos = 1) Then
      TextBox4.Value = "0.00" + Replace(TextBox4.Value, ".", "")
End If
TextBox4.Value = Replace(TextBox4.Value, "-", "")

Wenn ich es auf /1000 setze, funktioniert es vielleicht, aber es scheint, als würde es die Zahl ändern und dazu führen, dass es fehlschlägt.

Original: 25.1521584671082

/1000 : 2.51521584671082E-02

Wie Sie sehen, funktioniert es nicht wie erwartet.

Es sollte 0,0251521584671082E-02 werden (Und natürlich möchte ich nicht, dass „E-“ dort steht.Wenn es also möglich ist, dies zu tun, aber NUR zu verschieben und nicht tatsächlich zu dividieren (ich denke, Excel ist darauf beschränkt, mit wie vielen Zahlen es rechnen kann), dann wird es funktionieren.

Erwähnenswert ist, dass die angezeigten Zahlen aus irgendeinem Grund tatsächlich kleiner (kürzer) als die tatsächliche Zahl sind. Wenn ich sie in eine Textdatei aufschreibe, wird daraus Folgendes:

2.51521584671082E-02251521584671082E-02

Wie Sie sehen, bin ich bei der Berechnung wahrscheinlich an eine Wand gestoßen, sodass sie sich in „Zeichen“ ändert (ich weiß, dass diese in der Mathematik verwendet werden, aber ich habe keine Ahnung, was sie bedeuten, und für mich sind sie sowieso nutzlos).

Und ich denke, dass es an ihnen liegt, dass es scheitert, bin mir aber nicht sicher.

BEARBEITEN:

Okay, durch die Beschränkung auf 15 Dezimalstellen wird die korrekte Stelle zurückgegeben, aber ich möchte dies nicht tun. Sollte Excel wirklich auf nur 15 Dezimalstellen beschränkt sein, oder ist es „Double, Float usw.“, das dies bewirkt?

EDIT 2:

Tonys Beispiel liefert Folgendes:

Original: 177.582010543847177582010543847
Tony's: 0.1775820110177582011
Round(15decimals): 0.1775820105438470177582010543847

Ich bin mir nicht ganz sicher, aber ist es nicht falsch, oder habe ich vielleicht etwas falsch gemacht?

Wenn möglich, möchte ich, dass ALLE Dezimalstellen und Zahlen an ihrem Platz bleiben, da alles bereits korrekt ist, sie nur an der falschen Stelle sind.

/1000 löst dieses Problem, allerdings nicht auf die beste Art und Weise, da es eine Neuberechnung durchführt, statt nur zu verschieben.Normalerweise wäre es mir egal, die Ergebnisse sind die gleichen, aber hier spielt es eine Rolle, wie Sie sehen können.

Ich kann mir jedoch eine Lösung vorstellen, bei der ich nach der Position des Punktes suche, dann die letzten Dezimalstellen herausschneide, das Ergebnis durch 1000 dividiere und später die letzten Dezimalstellen hinzufüge, obwohl das eher ein Trick ist, ich bin mir nicht sicher, ob es wird tatsächlich funktionieren.

Ich komme zu dem Schluss, dass dies beantwortet ist, es tut, was ich will, und die Einschränkungen liegen in der Berechnung selbst, nicht in der Lösung.Alle Lösungen funktionieren im Großen und Ganzen auf die gleiche Weise, aber ich habe mich für die von Tony entschieden, da er der Erste war, der die Lösung in meiner Frage kommentierte.

Vielen Dank an alle!

War es hilfreich?

Lösung

Ihr Code fehlschlägt manchmal nicht, da es nicht um jede Situation handelt. Sie berechnen Textpos so:

generasacodicetagpre.

Sie handeln dann mit den TEXTPOS 4, 3, 2 oder 1., wenn beispielsweise textbox4.Value="2.22222" dann textpos= 0 und Sie haben keinen Code für diese Situation.

um 11:45 GMT, ich schlug in einen Kommentar vor, dass das Teilen von 1000 Ihnen das Ergebnis geben würde, das Sie suchen. Mit 14:08 GMT hat sich Tunderblaster dies als Antwort veröffentlicht. Es ist jetzt 15:23, aber Sie haben keines von uns reagiert.

Nachdem ich Ihren Code ausprobiert habe, weiß ich jetzt diese Antwort, die nicht mit dem Ergebnis übereinstimmen, das er gibt, wenn es funktioniert, weil Sie das Zeichen entfernen. Das Folgende würde Ihnen fast dieselbe wie eine funktionierende Version Ihres Codes geben:

generasacodicetagpre.

Der einzige Mangel mit dieser Aussage besteht darin, dass es nicht alle nachlaufenden Dezimalstellen nicht bewahrt. Ist das wirklich wichtig?

Während ich diese Antwort vorbereitete und positionierte, haben Sie Ihre Frage bearbeitet, um festzustellen, dass das Teilen mit 1000 manchmal das Ergebnis des wissenschaftlichen Formats erteilen würde. Meine Lösung vermeidet dieses Problem.

Andere Tipps

Es erscheint mir durch alle Ihre Bearbeitungen, die Sie die Zahl um eintausend teilen möchten.Dazu können Sie einfach verwenden

generasacodicetagpre.

Wenn Sie Gleitkommafehler bei der Division durch 10 vermeiden möchten, können Sie Folgendes verwenden Decimal Typ

Private Sub CommandButton1_Click()
    Dim d As Variant
    d = CDec(TextBox1.Text)
    TextBox1.Text = d / 1000
End Sub

ist das, was Sie versuchen?

generasacodicetagpre.

Versuchen Sie es.Es funktioniert, indem initiiert die Saite mit dem führenden generationspflichtigen 0, der den DP verlagert, die unnötige, dadurch unnötigste restliche führende ergroße generationsporticetagcode's

entfernt generasacodicetagpre.

Diese "Antwort" antwortet auf das Problem, das Sie so viel Präzision in dem Ergebnis wie möglich wünschen.

Als ich in der Schule war, wurde dies unechte Genauigkeit bezeichnet.Ich habe den größten Teil meiner Mathematik in diesem Bereich vergessen, aber ich werde versuchen, Ihnen das Problem zu verstehen.

Ich habe einen Wert, 2.46, der auf 2 Dezimalstellen genau ist.Das ist der wahre Wert ist irgendwo im Bereich von 2.455 bis 2.465.

Wenn ich diese Werte in eine Quadratwurzelfunktion füttere, bekomme ich:

generasacodicetagpre.

Daraus sehe ich, dass die Quadratwurzel des wahren Werts irgendwo zwischen 1,567 und 1,570 liegt;Alle zusätzlichen Dezimalziffer sind unwiderruflich.

Wenn ich richtig verstehe, möchten Sie diese Nummern verwenden, um Anpassungen vorzunehmen.In der Lage sind Sie, Anpassungen auf 15 Dezimalstellen vorzunehmen?

Wenn Sie sich an Ihren Kalkül erinnern, können Sie für eine bessere Erklärung nach "Propogisierung des Fehlers" aufsuchen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top