如何使用Excel VBA舍入到一定数量的有效数字?

时间:2012-07-31 14:58:56

标签: excel vba excel-vba excel-2010

编辑:此部分已解决!

所以我在我正在编写的程序中有一堆计算,而且数字越来越长,以至于我遇到了溢出错误。这是由于将50位数字除以另外50位数字之类的结果。我需要一种方法将特定数字舍入到一定数量的有效数字。

以下是一些更多信息。首先,我将要舍入的所有数字总是小于1.数字可以小到1E-50。我只关心前10个左右的有效数字。我只需要一种方法将其四舍五入到大约十个sig figs,然后再进行下一次计算以防止溢出错误。那个数字超过50个数字是没用的。

我在考虑是否可以逐位循环显示数字?当数字等于零时,程序可以将1加到计数器中,然后一旦它达到零以外的任何值,就会跳出循环。然后下一步可能会将数字截断到该计数器加上我想要的许多有效数字。

例如,对于.000001234567812345678。它将返回5个零。如果我想要10个有效数字,我会做5 + 10 = 15.程序将只保留小数点后的前15位数,因此该数字将被截断为.000001234567812。

另一个想法可能是使用日志。然后,新数字将被提升到的功率将是有效数字前面的零数。

我不知道的是,首先,如何逐个数字地检查,并检查每个数字是否为零。我也不知道如何将数字截断为一定数量的数字。

非常感谢任何帮助!

编辑:此部分未解决。

我很快就会发布另一篇文章,所以我会在这里问这个问题。如果在20分钟左右没有回答,也许我会再发一篇文章。为什么这不起作用?

Sub Rounding()
    Tracker = 0
    For i = 1 To 10
        Tracker = Tracker + 1
        Cells(1, Tracker) = Rnd
        Cells(1, Tracker) = Application.Evaluate("=Round(Cells(1, Tracker), 4 - (Int(Log(Cells(1,Tracker))) + 1))")
    Next
    Columns("A:J").EntireColumn.AutoFit
End Sub

我在每个单元格中都收到错误#NAME?这应该将每个数字四舍五入为四位有效数字。

4 个答案:

答案 0 :(得分:2)

假设您的值在A2中,请尝试以下任一方法:

=ROUND(A2, 3-(INT(LOG(A2))+1))

=ROUND(A2,3-LEN(INT(A2)))

取自here

答案 1 :(得分:1)

为什么你想要在已经有一个能够提供你想要的功能的情况下循环?

Sub Sample()
    Dim someNumber As Double

    '~~> .000001234567812345678
    someNumber = 1.23456781234568E-06

    '~~> This will give you .000001234567812
    Debug.Print Round(someNumber, 15)
End Sub

答案 2 :(得分:0)

如果3-(Int(范围(" A2"))/ log(10#))+ 1))为负(即如果之前有更多有效数字),则此操作无效小数点比你希望将数字四舍五入到)。另一种选择是

Public Function round_sigfig(ByVal myval As Double, ByVal fignum As Integer) As Double
factor = 10 ^ (fignum - (Int(Log(myval) / Log(10#))) - 1)
round_sigfig = Round(myval * factor, 0) / factor
End Function

答案 3 :(得分:-1)

我发现在excel工作表中,可以使用: = ROUND(A2,3-(INT(LOG(A2))+ 1))

但在VBA中,代码变为: = Round(范围(“A2”),3-(Int(Log(范围(“A2”))/ log(10#))+ 1))