【问题标题】:How to get excel to display a certain number of significant figures?如何让excel显示一定数量的有效数字?
【发布时间】:2013-12-17 22:09:38
【问题描述】:

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

我尝试使用以下等式

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

将 value 替换为我正在使用的数字,并将 sigfigs 替换为我想要的有效数字的数量。

这个公式有时有效,但有时无效。

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

如何让 excel 为我设置 sig figs 的数量,这样我就不必手动计算了?

【问题讨论】:

  • 那么你想要的是:18.036->18.0, 18.16->18.2 185.212->185, 1856705.5223->1860000?
  • 我知道的唯一方法是将您的数字转换为字符串,然后根据小数点的位置进行一些操作,我举个例子
  • 我试图通过使用长度来做这样的事情,但是 18 和 6.9 应该分别显示为 18.0 和 6.90,所以我需要的不仅仅是长度,我需要指定小数和整数部分的长度的数量。
  • 我正在编写一个例子,我正在做的是找到第一个 3 位不同的形式“0”,“”和“。”,然后找到“。”是

标签: excel spreadsheet rounding significant-digits


【解决方案1】:

公式(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 中获得的数字用于其他数学运算。

【讨论】:

  • 我以前从未使用过VBA,你能给我一个快速的速成课程吗?我有编程经验,所以我应该能够填补一些空白。它在哪里,我在哪里粘贴代码,我如何使用它?
  • @starbox - 我很抱歉,但这里不可能提供关于 VBA 的速成课程(不管它是否离题)。我将尝试找到一个合适的链接,并记住,您可能需要花费一个多小时才能完成此操作。您可以同时尝试其他选项,看看它是否给出了预期的结果。
  • 使用VBA只是意味着设置一个宏吗?
  • @starbox - 有点。但是由于您必须将参数传递给您的 Sub,您可能必须编写另一个 Sub 循环遍历所有目标单元格。
  • 任何非 VBA 解决方案?
【解决方案2】:

警告:前面有很长的 excel 公式

我还希望使用重要数字,但我无法使用 VBA,因为电子表格不支持它们。我去了这个问题/答案和许多其他网站,但所有答案似乎并没有一直处理所有数字。我对接受的答案很感兴趣,并且它接近了,但只要我的数字 #value! 错误。我确信我可以修好它,但我已经走上了一条路,只是继续前进。

问题:

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

解决方案:

我的解决方案是一个 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)))))

注意:我有一个名为“sigfigs”的命名范围,我的数字从单元格 A1 开始

测试结果:

到目前为止,我已经针对wikipedia list of examples 和我自己的示例进行了正面和负面的测试。我还测试了一些早期给我带来问题的值,并且似乎都产生了正确的结果。

我还测试了一些早期给我带来问题的值,现在似乎都产生了正确的结果。

3 Sig Figs 测试

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

注意事项:

处理负数

为了处理负数,如果小于 0,我已经包含了一个带有负号的连接,并将绝对值用于所有其他工作。

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我添加到您的公式中,因此它还自动显示正确的小数位数。在下面的公式中,将数字“2”替换为您想要的小数位数,这意味着您需要进行四次替换。这是更新后的公式:

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

      【讨论】:

      • 为了使这个值 >=10 和 3 sig figs 我必须将 &lt; 更改为 &lt;=。但是我认为更通用的解决方案更像&lt;2-1,其中 2 成为要替换的值。
      【解决方案5】:

      这是一个老问题,但我已经修改了 sancho.s 的 VBA 代码,使它成为一个接受两个参数的函数:1) 你想用适当的 sig figs (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
      

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

      【讨论】:

        【解决方案6】:

        四舍五入到有效数字是一回事......上面已解决。格式化为特定位数是另一回事......我会把它贴在这里给那些试图做我曾经做过的事情并最终来到这里的人(因为我将来可能会再次这样做)......

        显示四位数的示例:

        .

        使用主页 > 样式 > 条件格式

        新规则 > 仅格式化包含以下内容的单元格

        单元格值 > 介于 > -10 > 10 > 格式数字 3 位小数

        新规则 > 仅格式化包含以下内容的单元格

        单元格值 > -100 > 100 > 格式数字 2 位小数

        新规则 > 仅格式化包含以下内容的单元格

        单元格值 > 介于 > -1000 > 1000 > 格式数字小数点后 1 位

        新规则 > 仅格式化包含以下内容的单元格

        单元格值 > 不在 > -1000 > 1000 > 格式数字 0 小数位

        .

        确保这些是按此顺序排列并选中所有“如果为真则停止”框。

        【讨论】:

          【解决方案7】:

          下面的公式可以正常工作。有效数字的数量在第一个文本公式中设置。 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 中的原始值以避免传播小错误。

          【讨论】:

            【解决方案8】:

            作为一种非常简单的显示度量,无需使用四舍五入功能,您可以简单地更改数字的格式,并通过在数字后添加一个小数点来去除3位有效数字。

            即#,###。将显示以千为单位的数字。 #,###.. 以百万为单位显示数字。

            希望对你有帮助

            【讨论】:

              【解决方案9】:

              您可以尝试自定义格式。

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

              【讨论】:

              • 我不确定,或者我误解了它。格式 ##.0 导致 4141 显示为 4141.0。我想不出办法得到4140。
              • 要格式化没有小数点或小数位的文本,请使用 TEXT([value], "0")。例如,TEXT(-0.6, "0") 为 -1,TEXT(-0.5, "0") 为 0,TEXT(0.4, "0") 为 0,TEXT(0.5, "0") 为 1,等等。这也可以产生前导零; TEXT(15, "000") 是 015。
              【解决方案10】:

              你可以试试

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

              value :: 您要四舍五入的数字。

              sigfigs :: 您想要四舍五入的有效数字的数量。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-11-04
                • 1970-01-01
                • 2015-07-09
                • 2016-03-16
                • 2021-02-28
                • 2011-02-17
                相关资源
                最近更新 更多