如何获得excel以显示一定数量的重要数字?

时间:2013-12-17 22:09:39

标签: excel spreadsheet rounding significant-digits

我正在使用excel,我想显示一定数量的有效数字。

我尝试使用以下等式

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

将值替换为我使用的数字,将sigfigs替换为我想要的有效数字。

这个公式有时会起作用,但有时却没有。

例如,值18.036将更改为18,其中有2位有效数字。解决这个问题的方法是更改​​源格式以保留1个小数位。但这可以引入一个更重要的数字。例如,如果结果为182,然后小数位将其更改为182.0,那么现在我将有4个sig figs而不是3个。

我如何获得excel为我设置sig figs的数量,所以我不必手动弄明白?

10 个答案:

答案 0 :(得分:4)

公式(A2包含值和B2 sigfigs)

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

可能会在C2中为您提供所需的数字。但如果最后一位数为零,则不会以通用格式显示。然后,您必须应用特定于该组合的数字格式(值,sigfigs),这是通过VBA。以下应该有效。您必须传递三个参数(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中的数字进行其他数学运算。

答案 1 :(得分:3)

使用科学记数法,假如你有180000并且你需要4个sigfigs,唯一的方法是输入1.800x10 ^ 5

答案 2 :(得分:3)

警告:提前疯狂的excel公式

我还希望与重要数据合作,而我无法使用VBA,因为电子表格无法支持它们。我去了这个问题/答案和许多其他网站,但所有的答案似乎并不总是处理所有数字。我对接受的答案感兴趣,但是一旦我的数字是< 0.1我收到了 #value!错误。我确定我可以修复它,但我已经走了一条路,只是按下了。

<强>问题:

我需要在正面和负面模式下报告可变数量的有效数字,数字从10 ^ -5到10 ^ 5。此外,根据客户(以及purple math),如果提供的值 100 并且精确到+/- 1并且我们希望提供3 sig figs答案应该是&#39; 100。&#39;所以我也把它包括在内。

<强>解决方案:

我的解决方案是使用excel公式,该公式返回带有正数和负数所需的有效数字的文本值。

,但根据我的测试(概述如下),无论要求的数量和重要数字如何,都会产生正确的结果。我确信它可以简化,但目前还不在范围内。如果有人想建议简化,请给我留言!

=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)))))

注意: 我有一个名为&#34; sigfigs&#34;我的号码从单元格A1开始

测试结果:

到目前为止,我已经针对wikipedia list of examples和我自己的例子对其进行了正面和负面测试。我还测试了一些早期给我提出问题的价值,所有这些价值似乎都能产生正确的结果。

Results from Wikipedia examples

我还测试了一些早期给我提出问题的价值观,现在所有的价值都可以产生正确的结果。

3 Sig Fig Test

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

备注:

处理负数

要处理负数,如果小于0,我会在其中包含一个带负号的串联,并将绝对值用于所有其他工作。

施工方法: 它最初分为excel中的大约6列,执行各个步骤,最后我将所有步骤合并为上面的一个公式。

答案 3 :(得分:2)

这是一个老问题,但我已修改了sancho.s&#39; VBA代码,以便它具有两个参数的函数:1)您想要使用适当的sig figs(val)显示的数字,以及2)sig figs(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

它似乎适用于我迄今为止尝试过的所有用例。

答案 4 :(得分:1)

舍入到有效数字是上面提到的一件事。格式化为特定数字的数字是另一个...我会在这里发布它,为那些你想要做我现在做的事情并在这里结束(因为我将来可能再做一次)... < / p>

显示四位数的示例:

使用主页&gt;样式&gt;条件格式

新规则&gt;仅格式化包含

的单元格

细胞值&gt;之间&gt; -10&gt; 10>格式3位小数

新规则&gt;仅格式化包含

的单元格

细胞值&gt;之间&gt; -100&gt; 100&gt;格式2位小数

新规则&gt;仅格式化包含

的单元格

细胞值&gt;之间&gt; -1000&gt; 1000&gt;格式编号1小数位

新规则&gt;仅格式化包含

的单元格

细胞值&gt;不在&gt;之间-1000&gt; 1000&gt;格式编号0小数位

确保这些按顺序排列并检查所有&#34; Stop If True&#34;框。

答案 5 :(得分:1)

我添加到您的公式中,因此它也会自动显示正确的小数位数。在下面的公式中,替换数字&#34; 2&#34;使用您想要的小数位数,这意味着您需要进行四次替换。这是更新的公式:

=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。

答案 6 :(得分:0)

您可以尝试自定义格式。

这是一个速成课程: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

对于三个有效数字,我在自定义类型框中输入: [→100] ## 0;并[d = 100]#,## 0

答案 7 :(得分:0)

你可以尝试

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sales);
    mydb = new SalesDBHelper(this.getBaseContext());
    array_list = mydb.getAllSales();
}

::您希望舍入的数字。

sigfigs ::您希望舍入的有效数字的数量。

答案 8 :(得分:0)

下面的公式运行正常。有效数字的数量在第一个文本公式中设置。 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有效,如果您有超过此数字的数字,则增加最后三个零的数量,并将第二个4更改为零的数量+1。

请注意,显示的值将四舍五入为有效数字,并且仅用于显示/输出。如果要进一步计算,请使用A1中的原始值以避免传播小错误。

答案 9 :(得分:0)

作为一种非常简单的显示测量,无需使用舍入功能,您只需更改数字的格式,并通过在数字后面添加小数点来删除3位有效数字。

即。 #,###。会显示成千上万的数字。 #,### ..显示数百万的数字。

希望这有帮助