番号に変換することなく、数字文字列を1000で割るにはどうすればよいですか。

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

  •  26-12-2019
  •  | 
  •  

質問

私は、次のように見えるように、数字を変更した文字列を作成しようとしています。

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-"をそこにあることを望んでいません。 それがこれを行うことが可能であるならば、実際には動いていないだけでなく、分裂するだけではありません(私はそれがそれがそれがそれが計算できる数の数に限られていると思います)それは機能します。

注目に値する、表示される数字は実際には(より短い)、何らかの理由で実数の数が少なくて、テキストファイルに書き留めている場合、それはこれになります:

2.51521584671082E-02251521584671082E-02

あなたが見ることができるように、私はおそらく計算の壁にぶつかったので、それはキャラクターに変わります(私は数学を使っていることを知っていますが、彼らがどういう意味なのかわかりません、そしてとにかく私には無駄です)。

そして私はそれが失敗したことのせいだと思いますが、確かではありません。

編集:

大丈夫、15の小数を制限することによって正しい場所を返しますが、私はこのラウンドをしないようにしたいです。

編集2:

Tonyの例はこれを提供します:

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

本当に確信していませんが、間違っているのではない、またはおそらく私は何か間違っていましたか?

可能であれば、すべての小数点と番号がすでに正しいので、すべての小数点と数が滞在しておく必要があります。

/ 1000はこれを解決するが、動くだけではなく再計算するので、最良の方法ではない。 通常は気にしないでしょう、結果は同じですが、ここで見ることができる限り問題はありません。

しかし、私はドットの位置を探すまで、そして最後の小数を切り取ってから、結果を1000で分割し、その後最後の小数を追加しますが、それがハックのほかの桁数を追加します。それが実際に働くかどうかわからない

私はこれが答えられたと結論し、私が欲しいものをすること、そしてその制限はその解決策ではなく計算自体にあります。 すべてのソリューションはほとんど同じように機能しますが、私は彼が最初に私の質問で解決策をコメントすることを最初に騙しました。

多くの人に感謝します!

役に立ちましたか?

解決

コードはすべての状況を処理しないため、コードが失敗することがあります。 Textpos SO:

を計算します
TextPos = InStr(1, TextBox4.Value, ".") - 2
.

テキストポスを4,3,2または1に処理しますが、たとえばtextbox4.value="2.22222"からTextPos= 0で、その状況のコードがない場合は。

11:45 GMTでは、1000歳までに分割するコメントでお勧めします。 GMTの14:08で、TunderBlasterはこれを答えとして投稿しました。それは15:23ですが、あなたは私たちのどちらかに応答していません。

あなたのコードを試してみました、私は今度の答えがそれが機能する結果と一致しないことを知っています。以下はあなたのコードの作業版とほぼ同じになるでしょう:

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

このステートメントの唯一の欠陥は、すべての末尾の10進数を保存しないことです。これは本当に重要ですか?

この答えを準備している間に、あなたは1000年の割れ目が科学的形式で結果を与えることがあると述べるように質問を編集しました。私の解決策はその問題を回避します。

他のヒント

数を1000回除算したいすべての編集を通して私には見えます。これを行うには、単に

を使うことができます
TextBox4.Value = TextBox4.Value / 1000
.

10で割ったときに浮動小数点誤差を避けたい場合は、Decimal Type

を使用できます。
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
.

これを試してください。それはinitialyによって機能し、先頭の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
.

この「回答」という「回答」という回答は、結果として可能な限り多くの精度を必要とします。

私が学校にいたとき、これはスプリアスの精度と呼ばれました。私はこの分野で私の数学のほとんどを忘れましたが、私はあなたに問題を理解しようとします。

私は2.46を持っています、これは小数点以下2桁まで正確です。それは本当の値です2.455から2.465の範囲のどこかにあります。

これらの値を平方根関数に給紙すると、次のようになります。

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

これから私は真の値の平方根があると見なされます.1567から1.570の間のどこかです。余分な10進数はスプリアスです。

正しく理解した場合は、これらの数字を使用して調整します。あなたは15の10進数を調整することができますか?

あなたがあなたの計算を覚えていれば、より良い説明のために「エラーの提案」を調べることができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top