숫자로 변환하지 않고 숫자 문자열을 1000으로 어떻게 나눌 수 있나요?

StackOverflow https://stackoverflow.com//questions/21060907

  •  26-12-2019
  •  | 
  •  

문제

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

이 시도.처음에는 문자열을 선행으로 채워서 작동합니다. 0DP를 이동한 후 불필요한 나머지 선행 요소를 제거합니다. 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자리까지 조정할 수 있나요?

미적분학을 기억한다면 더 나은 설명을 위해 "오류 전파"를 찾아볼 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top