web-dev-qa-db-ja.com

Excelに特定の数の有効数字を表示させる方法は?

Excelを使用していて、特定の数の有効数字に値を表示したい。

次の方程式を使ってみました

=ROUND(value,sigfigs-1-INT(LOG10(ABS(value))))

値は私が使用している数に置き換えられ、sigfigsは必要な有効数字の数に置き換えられています。

この式は時々機能しますが、機能しない場合もあります。

たとえば、値18.036は18に変化し、2つの有効数字があります。これを回避する方法は、小数点以下1桁を保持するようにソース形式を変更することです。しかし、それはさらに重要な数字をもたらす可能性があります。たとえば、結果が182で、小数点以下の桁数が182.0に変更された場合、3桁ではなく4桁のイチジクになります。

Excelにsig figの数を設定して、手動で計算する必要がないようにするにはどうすればよいですか?

7
Veridian

式(A2には値とB2 sigfigsが含まれています)

=ROUND(A2/10^(INT(LOG10(A2))+1),B2)*10^(INT(LOG10(A2))+1)

たとえば、C2で必要な数を取得できます。ただし、最後の桁がゼロの場合、一般形式では表示されません。次に、その組み合わせに固有の数値形式(値、sigfigs)を適用する必要があります。これは、VBAを介して行われます。以下はうまくいくはずです。 3つのパラメータを渡す必要があります(val,sigd,trg)trgは、フォーマットするターゲットセルです。ここには、必要な数がすでにあります。

Sub fmt(val As Range, sigd As Range, trg As Range)
    Dim fmtstr As String, fmtstrfrac As String
    Dim nint As Integer, nfrac As Integer
    nint = Int(Log(val) / Log(10)) + 1
    nfrac = sigd - nint
    If (sigd - nint) > 0 Then
      'fmtstrfrac = "." & WorksheetFunction.Rept("0", nfrac)
      fmtstrfrac = "." & String(nfrac, "0")
    Else
      fmtstrfrac = ""
    End If
    'fmtstr = WorksheetFunction.Rept("0", nint) & fmtstrfrac
    fmtstr = String(nint, "0") & fmtstrfrac
    trg.NumberFormat = fmtstr
End Sub

数値の代わりに文字列を使用してもかまわない場合は、フォーマット文字列(たとえば、D2)を次のように取得できます。

=REPT("0",INT(LOG10(A2))+1)&IF(B2-(INT(LOG10(A2))+1)>0,"."&REPT("0",B2-(INT(LOG10(A2))+1)),"")

(これはVBAコードを複製します)そして次に(たとえば、E2で)使用します

=TEXT(C2,D2).

ここで、セルC2はまだ上記の数式を持っています。必要に応じて、セルE2を視覚化の目的で使用し、C2で取得した数値を他の計算に使用できます。

4
sancho.s

警告:非常に長いExcel数式が先にあります

また、重要な数値を処理することも検討していましたが、スプレッドシートはそれらをサポートできないため、VBAを使用できませんでした。私はこの質問/回答や他の多くのサイトに行きましたが、すべての回答が常にすべての数値を処理しているようには見えません。受け入れられた回答に興味があり、それに近づきましたが、私の数値が0.1未満になるとすぐに、#value!エラーが発生しました。私はそれを修正することができたと確信していますが、私はすでに道を進んでいて、ただ押しただけです。

問題:

正と負のモードで、10 ^ -5から10 ^ 5までの数値で、さまざまな数の有意な数値を報告する必要がありました。また、クライアント(および 紫の数学 )によると、100の値が指定され、+に正確である場合/-1と3つのsigイチジクで提示したい場合、答えは「100」になります。それも含めました。

ソリューション:

私の解決策は、正の数と負の数に必要な有効数字を含むテキスト値を返すExcel数式です。

それはlongですが、要求された数や有意な数値に関係なく、私のテスト(以下に概説)に従って正しい結果を生成するようです。簡略化できると確信していますが、現時点では対象外です。簡略化を提案したい場合は、コメントを残してください!

=TEXT(IF(A1<0,"-","")&LEFT(TEXT(ABS(A1),"0."&REPT("0",sigfigs-1)&"E+00"),sigfigs+1)*10^FLOOR(LOG10(TEXT(ABS(A1),"0."&REPT("0",sigfigs-1)&"E+00")),1),(""&(IF(OR(AND(FLOOR(LOG10(TEXT(ABS(A1),"0."&REPT("0",sigfigs-1)&"E+00")),1)+1=sigfigs,RIGHT(LEFT(TEXT(ABS(A1),"0."&REPT("0",sigfigs-1)&"E+00"),sigfigs+1)*10^FLOOR(LOG10(TEXT(ABS(A1),"0."&REPT("0",sigfigs-1)&"E+00")),1),1)="0"),LOG10(TEXT(ABS(A1),"0."&REPT("0",sigfigs-1)&"E+00"))<=sigfigs-1),"0.","#")&REPT("0",IF(sigfigs-1-(FLOOR(LOG10(TEXT(ABS(A1),"0."&REPT("0",sigfigs-1)&"E+00")),1))>0,sigfigs-1-(FLOOR(LOG10(TEXT(ABS(A1),"0."&REPT("0",sigfigs-1)&"E+00")),1)),0)))))

注:「sigfigs」という名前の範囲があり、数値はセルA1で始まります

テスト結果:

私は wikipedia list of examples と私自身の例に対してこれまでにポジティブとネガティブでテストしました。また、いくつかの値を使用してテストを行った結果、問題が早期に発生し、すべてが正しい結果を生成するように見えました。

Results from Wikipedia examples

また、いくつかの値を使用してテストを行った結果、初期の段階で問題が発生しましたが、すべて正しい結果が得られるようです。

3 Sig Figs Test

99.99 -> 100.
99.9 -> 99.9
100 -> 100.
101 -> 101

注:

負の数の処理

負の数を処理するために、0未満の場合は負の符号を使用した連結を含め、他のすべての作業には絶対値を使用しました。

構築方法:最初はさまざまな手順を実行するExcelで約6列に分割され、最後にすべての手順を1つの数式にマージしました上記。

4
Sisyphus

科学表記法を使用します。たとえば、180000で4 sigfigsが必要な場合は、1.800x10 ^ 5と入力するのが唯一の方法です。

3
aberg

これは古い質問ですが、2つの引数を取る関数になるようにsancho.sのVBAコードを変更しました。1)適切なsigイチジクで表示する数値(val)、および2)sigの数イチジク(sigd)。これをExcelのアドイン関数として保存し、通常の関数として使用できます。

Public Function sigFig(val As Range, sigd As Range)
    Dim nint As Integer
    Dim nfrac As Integer
    Dim raisedPower As Double
    Dim roundVal As Double
    Dim fmtstr As String
    Dim fmtstrfrac As String

    nint = Int(Log(val) / Log(10)) + 1
    nfrac = sigd - nint

    raisedPower = 10 ^ (nint)
    roundVal = Round(val / raisedPower, sigd) * raisedPower

    If (sigd - nint) > 0 Then
        fmtstrfrac = "." & String(nfrac, "0")
    Else
        fmtstrfrac = ""
    End If

    If nint <= 0 Then
        fmtstr = String(1, "0") & fmtstrfrac
    Else
        fmtstr = String(nint, "0") & fmtstrfrac
    End If

    sigFig = Format(roundVal, fmtstr)
End Function

これまでに試したすべてのユースケースで機能するようです。

2
ken

非常に単純な表示方法として、丸め関数を使用せずに、数値の形式を変更し、数値の後に小数点を追加することで3つの有効数字を削除できます。

つまり#、###。数を千単位で表示します。 #、### ..は数を百万単位で示します。

お役に立てれば

1
Don

私はあなたの数式に追加したので、それも自動的に表示されます正しい小数点以下の桁数です。次の式で、数字の「2」を必要な小数点以下の桁数に置き換えます。つまり、4つの置換を行う必要があります。更新された式は次のとおりです。

=TEXT(ROUND(A1,2-1-INT(LOG10(ABS(A1)))),"0"&IF(INT(LOG10(ABS(ROUND(A1,2-1-INT(LOG10(ABS(A1)))))))<1,"."&REPT("0",2-1-INT(LOG10(ABS(ROUND(A1,2-1-INT(LOG10(ABS(A1)))))))),""))

たとえば、セルA1の値が= 1/3000、つまり0.000333333 ..である場合、上記の数式のとおり、0.00033が出力されます。

1
DavidMack

有効数字への丸めは1つのことです...上で説明しました。特定の桁数にフォーマットすることは別のことです...そして、私がここで私がやったことをしようとしている人のためにここに投稿します(そして、私はおそらく今後再び行うでしょう)...

4桁を表示する例:

ホーム>スタイル>条件付き書式を使用

新しいルール>を含むセルのみをフォーマット

セル値> -10の間> 10>小数点以下3桁のフォーマット

新しいルール>を含むセルのみをフォーマット

セル値>> -100> 100>小数点以下2桁のフォーマット

新しいルール>を含むセルのみをフォーマット

セル値>> -1000> 1000> Format Number 1の小数点以下

新しいルール>を含むセルのみをフォーマット

セル値>> -1000> 1000の間ではない>数値0の小数点以下の桁数

これらがこの順序になっていることを確認し、「すべての場合に停止」ボックスをすべてオンにします。

1
dox

あなたは試すことができます

=ROUND(value,sigfigs-(1+INT(LOG10(ABS(value)))))

::丸めたい数値。

sigfigs ::丸めたい有効数字の数。

0
Rooster

代わりにカスタム書式を試すことができます。

ここにクラッシュコースがあります: https://support.office.com/en-nz/article/Create-a-custom-number-format-78f2a361-936b-4c03-8772-09fab54be7f4? ui = en-US&rs = en-NZ&ad = NZ

重要な3つの数値について、これをカスタムタイプボックスに入力します:[> 100] ##。0; [<= 100]#、## 0

0
Alexis

以下の式はうまくいきます。有効数字の数は、最初のテキスト式で設定されます。 3sfの場合は0.00および4、2sfの場合は0.0および3、5sfの場合は0.0000および6など。

=(LEFT((TEXT(A1,"0.00E+000")),4))*POWER(10,
(RIGHT((TEXT(A1,"0.00E+000")),4)))

この式はE +/- 999に対して有効です。これを超える数値がある場合、最後の3つのゼロの数を増やし、2番目の4をゼロの数+1に変更します。

表示される値は有効数字に丸められ、表示/出力のみに使用されることに注意してください。さらに計算を行う場合は、A1の元の値を使用して、小さなエラーの伝搬を回避します。

0
Geoff Willis