Comment puis-je diviser une chaîne numérique par 1000 sans la convertir en nombre ?
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!
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 0
c'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.