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

Ver*_*ian 7 excel spreadsheet rounding significant-digits

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

我尝试使用以下等式

=ROUND(value,sigfigs-1-INT(LOG10(ABS(value))))
Run Code Online (Sandbox Code Playgroud)

价值被我使用的数字所取代,sigfigs被我想要的有效数字所取代.

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

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

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

san*_*ica 5

公式(A2 包含值和 B2 sigfigs)

=ROUND(A2/10^(INT(LOG10(A2))+1),B2)*10^(INT(LOG10(A2))+1)
Run Code Online (Sandbox Code Playgroud)

可能会为您提供所需的数字,例如 C2 中的数字。但如果最后一位数字为零,则不会以通用格式显示。然后,您必须通过 VBA 应用特定于该组合的数字格式(值、sigfigs)。以下应该有效。您必须传递三个参数(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
Run Code Online (Sandbox Code Playgroud)

如果您不介意使用字符串而不是数字,那么您可以获得格式字符串(例如,D2):

=REPT("0",INT(LOG10(A2))+1)&IF(B2-(INT(LOG10(A2))+1)>0,"."&REPT("0",B2-(INT(LOG10(A2))+1)),"")
Run Code Online (Sandbox Code Playgroud)

(这复制了 VBA 代码)然后使用(例如,E2)

=TEXT(C2,D2).
Run Code Online (Sandbox Code Playgroud)

其中单元格 C2 仍然具有上述公式。如果需要,您可以使用单元格 E2 进行可视化,并使用 C2 中获得的数字进行其他数学运算。


Sis*_*hus 5

警告:前面是疯狂的 excel 公式

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

问题:

我需要以正负模式报告可变数量的有效数字,数字从 10^-5 到 10^5。此外,根据客户(以及紫色数学),如果提供的值为100并且精确到 +/- 1,并且我们希望提供 3 个无花果,那么答案应该是“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)))))
Run Code Online (Sandbox Code Playgroud)

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

检测结果:

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

来自维基百科示例的结果

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

3 无花果测试

99.99 -> 100.
99.9 -> 99.9
100 -> 100.
101 -> 101
Run Code Online (Sandbox Code Playgroud)

笔记:

处理负数

为了处理负数,我在小于 0 时加入了一个带有负号的连接,并在所有其他工作中使用绝对值。

构建方法: 最初在excel中分为大约6列执行各个步骤,最后我将所有步骤合并为一个公式。