Question

J'essaie de créer une certaine chaîne avec le formulaire de changement de chiffres, afin qu'elle ressemble à ci-dessous.

Modifié pour afficher avec des chiffres au lieu de X.

Alors mettons-nous en place, j'obtiens un numéro, comme celui-ci.

234.123123123

Je dois changer son apparence, pour 3 chiffres avant un point, il faudrait qu'il devienne.

0.234123123123

Et disons que c'est 2,23123123123, cela deviendrait 0,0023123123123

Maintenant, je vais essayer d'expliquer la formule, avec mon anglais.

La formule doit changer la position du point ".".Vous pouvez voir que cela change de place, mais vous pouvez aussi voir que j'ajoute des 0.

C'est important, les 0 doivent être ajoutés SI le point se trouve à l'extrême gauche (au début de la chaîne).

Alors, de combien le Dot doit-il bouger ?

Le point doit toujours se déplacer de 3 pas vers la gauche.

Et s'il touche le mur (le début de la chaîne), vous devez ajouter des 0, puis un 0 avant le point.

Donc, si le nombre est, 2.222222, je devrai d'abord déplacer le point vers la gauche, montrez étape par étape.

Step 1:
.2222222

Step 2:
.02222222

Step 3:
0.02222222

Il doit toujours y avoir un 0 avant le point, s'il atteint le début.

Cela semble plus compliqué que ça ne l'est, c'est juste que je ne sais pas comment l'expliquer.

MODIFIER:

Ma tentative :

      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, "-", "")

Si je /1000, cela peut fonctionner, mais il semble que cela modifiera le nombre, le laissant échouer.

Original: 25.1521584671082

/1000 : 2.51521584671082E-02

Comme vous pouvez le constater, cela ne fonctionne pas comme prévu.

Cela devrait devenir 0,0251521584671082E-02 (Et bien sûr, je ne veux pas que " E- " soit là.Donc, s'il est possible de faire cela, mais SEULEMENT en déplaçant et pas réellement en divisant (je pense qu'Excel est limité au nombre de nombres avec lesquels il peut calculer), alors cela fonctionnera.

Il convient de noter que les nombres affichés sont en fait inférieurs (plus courts) au nombre réel pour une raison quelconque. Si je l'écris dans un fichier texte, cela devient ceci :

2.51521584671082E-02251521584671082E-02

Donc, comme vous pouvez le voir, j'ai probablement heurté un mur dans le calcul, donc cela se change en personnages (je sais que les mathématiques les utilisent, mais je n'ai aucune idée de ce qu'ils signifient, et ils sont inutiles pour moi de toute façon).

Et je pense que c'est à cause d'eux que ça échoue, mais je n'en suis pas sûr.

MODIFIER:

D'accord, en limitant à 15 décimales, cela renverra le bon endroit, mais je voudrais ne pas faire ce tour, Excel devrait-il vraiment être limité à seulement 15 décimales, ou est-ce "Double, Float, etc" qui fait cela ?

MODIFIER 2 :

L'exemple de Tony fournit ceci :

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

Je ne suis pas vraiment sûr, mais n'est-ce pas incorrect, ou peut-être ai-je fait quelque chose de mal ?

Si possible, je veux que TOUTES les décimales et tous les nombres restent en place, car tout est déjà correct, c'est juste qu'ils sont au mauvais endroit.

/1000 résout ce problème, mais pas de la meilleure façon, car il recalculera au lieu de simplement se déplacer.Normalement, je m'en fiche, les résultats sont les mêmes, mais ici, cela compte, comme vous pouvez le voir.

Je peux cependant penser à une solution, où je cherche la position du point, puis découpe les dernières décimales, divise le résultat par 1000, puis ajoute plus tard les dernières décimales, bien que ce soit plutôt un hack, je ne sais pas si cela fonctionnera réellement.

Je conclus que la réponse est à cette question, qu'elle fait ce que je veux et que les limites résident dans le calcul lui-même, pas dans la solution.Toutes les solutions fonctionnent à peu près de la même manière, mais j'ai choisi celle de Tony car il a été le premier à commenter la solution dans ma question.

Merci beaucoup tout le monde!

Était-ce utile?

La solution

Vous échouez parfois car il ne gère pas toutes les situations. Vous calculez textposs tellement:

TextPos = InStr(1, TextBox4.Value, ".") - 2

Vous gérez ensuite Textpos étant 4, 3, 2 ou 1. mais si, par exemple, textbox4.value="2.22222" puis textpos= 0 et vous n'avez aucun code pour cette situation.

à 11h45 GMT, j'ai suggéré dans un commentaire qui divisant par 1000 vous donnerait le résultat que vous recherchez. À 14h08 GMT, TunderBlaster a affiché cela comme une réponse. C'est maintenant 15:23 mais vous n'avez pas répondu à nous.

Après avoir essayé votre code, je sais maintenant que ces réponses ne correspondent pas au résultat que cela donne lorsqu'il fonctionne parce que vous supprimez le signe. Ce qui suit vous donnerait presque la même chose qu'une version de travail de votre code:

TextBox4.Value = Format(Abs(Val(TextBox4.Value)) / 1000, "#,##0.#########")

Le seul déficit avec cette affirmation est qu'il ne préserve pas tous les chiffres décimaux de fuite. Est-ce vraiment important?

Pendant que je préparais et publié cette réponse, vous avez édité votre question à indiquer que la division par 1000 donnerait parfois le résultat en format scientifique. Ma solution évite ce problème.

Autres conseils

Cela me semble à travers toutes vos modifications que vous souhaitez diviser le nombre de mille.Pour ce faire, vous pouvez simplement utiliser

TextBox4.Value = TextBox4.Value / 1000

Si vous souhaitez éviter une erreur de virgule flottante lors de la division par 10, vous pouvez utiliser le Decimal taper

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

Est-ce ce que vous essayez?

Sub Sample()
    Dim sNum As String, SFinal As String
    Dim sPref  As String, sSuff As String
    Dim nlen As Long

    sNum = "234.123123123123123123131231231231223123123"

    SFinal = sNum

    If InStr(1, sNum, ".") Then
        sPref = Trim(Split(sNum, ".")(0))
        sSuff = Trim(Split(sNum, ".")(1))
        nlen = Len(sPref)

        Select Case nlen
            Case 1: SFinal = ".00" & Val(sPref) & sSuff
            Case 2: SFinal = ".0" & Val(sPref) & sSuff
            Case 3: SFinal = "." & Val(sPref) & sSuff
        End Select
    End If

    Debug.Print SFinal
End Sub

Essaye ça.Cela fonctionne en remplissant initialement la chaîne avec le début 0's, en décalant le DP, puis en supprimant tout leader restant inutile 0c'est

Function ShiftDecimalInString(str As String, Places As Long) As String
    Dim i As Long
    If Places > 0 Then
        ' Move DP to left
        '  Pad with leading 0's
        str = Replace$(Space$(Places), " ", "0") & str

        ' Position of .
        i = InStr(str, ".")
        str = Replace$(str, ".", "")

        If i > 0 Then
            ' Shift . to left
            str = Left$(str, i - Places - 1) & "." & Mid$(str, i - Places)

            ' strip unnecassary leading 0's
            Do While Left$(str, 2) = "00"
                str = Mid$(str, 2)
            Loop
            If str Like "0[!.]*" Then
                str = Mid$(str, 2)
            End If

            ShiftDecimalInString = str
        Else
            ' No . in str
            ShiftDecimalInString = str
        End If
    ElseIf Places < 0 Then
        ' ToDo: Handle moving DP to right
    Else
        ' shift DP 0 places
        ShiftDecimalInString = str
    End If
End Function

Cette "réponse" réponses à la question que vous souhaitez autant de précision dans le résultat que possible.

Quand j'étais à l'école, cela s'appelait une précision parasite.J'ai oublié la plupart de mes mathématiques dans ce domaine, mais je vais essayer de vous donner une compréhension de la question.

J'ai une valeur, 2,46, ce qui est précis à 2 décimales.C'est la vraie valeur est quelque part dans la plage de 2,455 à 2,465.

Si je nourris ces valeurs dans une fonction racine carrée, je vais obtenir:

sqrt(2.455) = 1.566843961599240
sqrt(2.46)  = 1.568438714135810
sqrt(2.465) = 1.570031846810760

De cela, je vois que la racine carrée de la valeur réelle est quelque part entre 1,567 et 1,570;Tous les chiffres décimaux supplémentaires sont faux.

Si je comprends bien correctement, vous souhaitez utiliser ces numéros pour effectuer des ajustements.Êtes-vous capable de faire des ajustements à 15 chiffres décimaux?

Si vous vous souvenez de votre calcul, vous pouvez rechercher "propogation d'erreur" pour une meilleure explication.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top