¿Cómo puedo dividir una cadena de números por 1000 sin convertir al número?
Pregunta
Estoy tratando de hacer una cierta cadena con el formulario de cambio de dígitos, de modo que se vea a continuación.
modificado para mostrar con dígitos en lugar de x.
así que estemos estableciendo, obtengo un número, como este.
234.123123123
Necesito cambiar cómo aparece, por 3 dígitos antes de un punto, tendría que convertirse.
0.234123123123
y digamos que es 2.23123123123, eso se convertiría en, 0.0023123123123
ahora intentaré explicar la fórmula, desnuda con mi inglés.
La fórmula necesita cambiar la posición del punto ".". Puedes ver que cambia el lugar, pero también puedes ver que estoy agregando 0s.
Eso es importante, las 0as deben agregarse si el punto obtenga a la izquierda (el comienzo de la cadena).
Entonces, ¿cuánto debe mover el punto?
El punto debe mover siempre 3 pasos a la izquierda.
y si golpeó la pared (el inicio de la cadena) necesita agregar 0s, y luego uno 0s antes del punto.
Entonces, si el número es, 2.222222 Primero tendré que mover el punto a la izquierda, vamos a mostrar paso a paso.
Step 1:
.2222222
Step 2:
.02222222
Step 3:
0.02222222
Siempre debe ser un 0 antes del punto, nunca llegó al inicio.
Suena más complicado, entonces es, es decir, no sé cómo explicarlo.
Editar:
Mi intento:
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 I / 1000 IT, puede funcionar, pero parece que alterará el número, dejándolo fallar.
Original: 25.1521584671082
/1000 : 2.51521584671082E-02
Como puede ver, no funciona como se esperaba.
Debe convertirse en 0.0251521584671082E-02 (y, por supuesto, no quiero "e-" estar allí. Entonces, si es posible hacer esto, pero solo en movimiento y en realidad, dividiendo (creo que Excel se limita a la cantidad de números con la que puede calcular), funcionará.
Vale la pena señalar, los números mostrados son en realidad menos (más cortos), entonces el número real por alguna razón, si lo escribo a un archivo de texto, se convierte en esto:
2.51521584671082e-02251521584671082e-02
Como puede ver, probablemente golpee una pared en el cálculo, por lo que cambia a los personajes (sé que las matemáticas usan aquellas, pero no tienen idea de lo que significan, y son inútiles para mí de todos modos).
y creo que es debido a ellos que falla, no estoy seguro de.
Editar:
De acuerdo, al limitar a 15 decimales, devolverá el lugar correcto, pero me gustaría que no hiciera esta ronda, debería sobresalir realmente se limitará a solo 15 decimales, o es "doble, flotante, etc." que hace esto ?
Editar 2:
El ejemplo deTony proporciona esto:
Original: 177.582010543847177582010543847
Tony's: 0.1775820110177582011
Round(15decimals): 0.1775820105438470177582010543847
No estoy realmente seguro, pero ¿no es incorrecto, o tal vez hice algo mal?
Si es posible, quiero que todos los decimales y el número permanezcan en su lugar, ya que todo es correcto, es solo que están en el lugar equivocado.
/ 1000 resuelve esto, pero no de la mejor manera, ya que recalculará en lugar de simplemente moverse. Normalmente no me importaría, los resultados son los mismos, pero aquí está importar lo que puede ver.
Puedo pensar en una solución, donde l que busco la posición del punto, luego recorte los últimos decimales, divida el resultado en 1000, luego agregue los últimos decimales, aunque es más un truco, No estoy seguro si realmente funcionará.
Concluyo que esto se responde, hace lo que quiero, y las limitaciones están en el cálculo en sí, no la solución. Todas las soluciones funcionan bastante de la misma manera, pero elegí Tony, ya que fue el primero en comentar la solución en mi pregunta.
muchas gracias a todos!
Solución
Tu código a veces falla porque no maneja todas las situaciones. Usted calcula los puntos de texto SO:
TextPos = InStr(1, TextBox4.Value, ".") - 2
Luego, maneja los puntos de texto 4, 3, 2 o 1., pero si, por ejemplo, textbox4.value="2.22222" luego textpos= 0 y no tiene código para esa situación.
a las 11:45 GMT, sugerí que en un comentario que se divide por 1000 le daría el resultado que buscas. A las 14:08 GMT, Tunderblaster publicó esto como una respuesta. Ahora es 15:23 pero no ha respondido a ninguno de nosotros.
Habiendo intentado su código, ahora sé que estas respuestas no coinciden con el resultado que le da cuando funciona porque elimina el letrero. Lo siguiente le daría casi lo mismo que una versión de trabajo de su código:
TextBox4.Value = Format(Abs(Val(TextBox4.Value)) / 1000, "#,##0.#########")
La única deficiencia con esta declaración es que no preserva todos los dígitos decimales que se arrastran. ¿Es esto realmente importante?
Mientras estaba preparando y publicando esta respuesta, editó su pregunta para indicar que la división en 1000 a veces daría el resultado en formato científico. Mi solución evita ese problema.
Otros consejos
Me parece a través de todas sus ediciones que desea dividir el número por mil.Para hacer esto, simplemente puede usar
TextBox4.Value = TextBox4.Value / 1000
Si desea evitar el error de punto flotante cuando se divide por 10, puede usar el tipo Decimal
Private Sub CommandButton1_Click()
Dim d As Variant
d = CDec(TextBox1.Text)
TextBox1.Text = d / 1000
End Sub
¿Es esto lo que estás intentando?
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
Intenta esto.Funciona mediante el relleno inicialmente de la cadena con los principales generadores de generación, cambiando el DP, y luego eliminando cualquier innensario.
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
Esta "respuesta" respuestas al problema que desea la mayor precisión posible en el resultado posible.
Cuando estaba en la escuela, esto se llamaba exactitud espuria.He olvidado la mayoría de mis matemáticas en esta área, pero trataré de darle una comprensión del problema.
Tengo un valor, 2.46, que es preciso a 2 lugares decimales.Ese es el verdadero valor en algún lugar del rango 2.455 a 2.465.
Si alimento estos valores en una función de raíz cuadrada, obtendré:
sqrt(2.455) = 1.566843961599240
sqrt(2.46) = 1.568438714135810
sqrt(2.465) = 1.570031846810760
de esto veo la raíz cuadrada del valor real es en algún lugar entre 1.567 y 1.570;Cualquier dígito extra decimal es espurio.
Si entiendo correctamente, desea utilizar estos números para realizar ajustes.¿Eres capaz de realizar ajustes a 15 dígitos decimales?
Si recuerda su cálculo, puede buscar "la profecación de error" para obtener una mejor explicación.