숫자로 변환하지 않고 숫자 문자열을 1000으로 어떻게 나눌 수 있나요?
문제
Digits 변경 형식으로 특정 문자열을 만들어서 아래와 같이 보이도록 하려고 합니다.
X 대신 숫자로 표시되도록 수정되었습니다.
그럼 설정해 보겠습니다. 이렇게 숫자가 나옵니다.
234.123123123
표시되는 방식을 변경해야 합니다. 점 앞의 3자리 숫자는 이렇게 되어야 합니다.
0.234123123123
그리고 2.23123123123이라고 가정하면 0.0023123123123이 됩니다.
이제 나는 영어로 공식을 설명하려고 노력할 것입니다.
수식에서는 점 "."의 위치를 변경해야 합니다.장소가 바뀌는 것을 볼 수 있습니다. 그러나 0을 추가하는 것도 볼 수 있습니다.
점이 중요합니다. 점이 가장 왼쪽(문자열의 시작 부분)에 오면 0을 추가해야 합니다.
그러면 점이 얼마나 움직여야 할까요?
점은 항상 왼쪽으로 3단계 이동해야 합니다.
그리고 그것이 벽(문자열의 시작)에 부딪히면 0을 추가하고 점 앞에 0을 하나 추가해야 합니다.
따라서 숫자가 2.222222 인 경우 먼저 점을 왼쪽으로 이동해야합니다. 단계별로 표시합시다.
Step 1:
.2222222
Step 2:
.02222222
Step 3:
0.02222222
점이 시작되기 전에는 항상 0이어야 합니다.
그보다 더 복잡하게 들리는데, 어떻게 설명해야 할지 모르겠습니다.
편집하다:
내 시도:
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, "-", "")
i/1000이면 작동할 수 있지만 숫자가 변경되어 실패하게 되는 것처럼 보입니다.
Original: 25.1521584671082
/1000 : 2.51521584671082E-02
보시다시피 예상대로 작동하지 않습니다.
0.0251521584671082E-02가 되어야 합니다(물론 "E-"가 거기에 있는 것을 원하지 않습니다.따라서 이렇게 하는 것이 가능하지만 이동만 하고 실제로 나누는 것이 아닌 경우(Excel은 계산할 수 있는 숫자의 수에 따라 제한된다고 생각합니다) 그러면 작동할 것입니다.
주목할 만한 점은 표시된 숫자가 어떤 이유에서인지 실제 숫자보다 실제로 적습니다(더 짧습니다). 텍스트 파일에 기록하면 다음과 같습니다.
2.51521584671082E-02251521584671082E-02
보시다시피 계산에서 벽에 부딪혔을 수 있으므로 문자로 변경됩니다(수학이 이를 사용한다는 것은 알지만 그것이 무엇을 의미하는지 모르고 어쨌든 나에게는 쓸모가 없습니다).
그리고 나는 그것이 실패하는 것이 그들 때문이라고 생각하지만 확실하지는 않습니다.
편집하다:
좋아, 소수점 이하 15자리로 제한하면 올바른 위치가 반환되지만 이 라운드는 수행하지 않고 싶습니다. Excel이 실제로 소수점 이하 15자리로 제한되어야 하나요, 아니면 "Double,Float etc"로 이 작업을 수행합니까?
편집 2:
Tony의 예는 다음을 제공합니다.
Original: 177.582010543847177582010543847
Tony's: 0.1775820110177582011
Round(15decimals): 0.1775820105438470177582010543847
확실하지는 않지만 정확하지 않은가요, 아니면 제가 뭔가 잘못한 것 아닌가요?
가능하다면 모든 소수점과 숫자가 제자리에 유지되기를 바랍니다. 모든 것이 이미 정확하기 때문에 단지 잘못된 위치에 있을 뿐입니다.
/1000은 이 문제를 해결하지만 이동하는 대신 다시 계산하므로 최선의 방법은 아닙니다.일반적으로 나는 상관하지 않습니다. 결과는 동일하지만 여기서는 보시다시피 중요합니다.
그러나 나는 점의 위치를 찾은 다음 마지막 소수점을 잘라내고 결과를 1000으로 나눈 다음 나중에 마지막 소수점을 추가하는 솔루션을 생각할 수 있습니다. 비록 그것이 해킹에 가깝지만 확실하지 않습니다. 실제로 작동할 것입니다.
나는 이것이 답변되었으며 내가 원하는 것을 수행하며 한계는 솔루션이 아니라 계산 자체에 있다고 결론을 내립니다.모든 솔루션은 거의 같은 방식으로 작동하지만 내 질문에 대한 솔루션에 대해 처음으로 의견을 제시한 Tony를 선택했습니다.
모두들 감사합니다!
해결책
모든 상황을 처리하지 못하기 때문에 코드가 실패하는 경우가 있습니다.TextPos를 다음과 같이 계산합니다.
TextPos = InStr(1, TextBox4.Value, ".") - 2
그런 다음 TextPos를 4, 3, 2 또는 1로 처리합니다.그러나 예를 들어 TextBox4.Value = "2.22222"이면 TextPos = 0이고 해당 상황에 대한 코드가 없습니다.
11:45 GMT에 나는 1000으로 나누면 원하는 결과를 얻을 수 있다는 의견을 제안했습니다.14:08 GMT에 tunderblaster가 이것을 답변으로 게시했습니다.지금은 15시 23분인데 당신은 우리 중 누구에게도 응답하지 않았습니다.
귀하의 코드를 시험해 본 결과 이제 이러한 답변이 기호를 제거했기 때문에 작동할 때 제공되는 결과와 일치하지 않는다는 것을 알았습니다.다음은 코드의 작업 버전과 거의 동일합니다.
TextBox4.Value = Format(Abs(Val(TextBox4.Value)) / 1000, "#,##0.#########")
이 명령문의 유일한 결함은 모든 후행 십진수를 보존하지 않는다는 것입니다.이것이 정말로 중요합니까?
제가 이 답변을 준비하고 게시하는 동안 귀하는 질문을 편집하여 1000으로 나누면 때때로 과학적 형식의 결과가 제공된다는 점을 명시하셨습니다.내 솔루션은 해당 문제를 방지합니다.
다른 팁
당신이 편집한 모든 내용을 보면 숫자를 1000으로 나누고 싶은 것 같습니다.이렇게 하려면 간단히 다음을 사용하면 됩니다.
TextBox4.Value = TextBox4.Value / 1000
10으로 나눌 때 부동 소수점 오류를 방지하려면 다음을 사용할 수 있습니다. Decimal
유형
Private Sub CommandButton1_Click()
Dim d As Variant
d = CDec(TextBox1.Text)
TextBox1.Text = d / 1000
End Sub
이것이 당신이 시도하는 것입니까?
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
이 시도.처음에는 문자열을 선행으로 채워서 작동합니다. 0
DP를 이동한 후 불필요한 나머지 선행 요소를 제거합니다. 0
'에스
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
이 "답변"은 결과의 정확성을 최대한 높이고자 하는 문제에 대한 응답입니다.
제가 학교에 다닐 때는 이것을 가짜 정확도(spurious Accuracy)라고 불렀습니다.나는 이 분야에 관한 수학의 대부분을 잊어버렸지만 여러분에게 이 문제에 대한 이해를 제공하려고 노력할 것입니다.
값은 2.46으로 소수점 이하 2자리까지 정확합니다.즉, 실제 값은 2.455에서 2.465 사이에 있습니다.
이 값을 제곱근 함수에 입력하면 다음과 같은 결과를 얻을 수 있습니다.
sqrt(2.455) = 1.566843961599240
sqrt(2.46) = 1.568438714135810
sqrt(2.465) = 1.570031846810760
이것으로부터 나는 실제 값의 제곱근이 1.567과 1.570 사이에 있다는 것을 알 수 있습니다.추가 십진수는 가짜입니다.
내가 이해한 것이 맞다면 이 숫자를 사용하여 조정하고 싶으신 것입니다.소수점 15자리까지 조정할 수 있나요?
미적분학을 기억한다면 더 나은 설명을 위해 "오류 전파"를 찾아볼 수 있습니다.