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

编辑:这部分解决了!

所以我在我正在做的一个程序中有一堆计算,并且数字越来越长,我得到溢出错误。 这是由于将50位数字除以另一个50位数字所致。 我需要一种方法来将特定数字四舍五入到一定数量的有效数字。

这里有一些更多的信息。 首先,所有我要舍入的数字总是小于1.数字可以小到1E-50。 我只关心前10位有效数字。 为了防止溢出错误,我只需要一种方法将其舍弃到十个字左右,然后再进行下一个计算。 那么,有一个数字出去50个数字是非常无用的。

我在想也许是循环数字,逐位数字? 当这个数字等于零时,程序可以给计数器加1,然后一旦碰到零以外的任何东西就跳出循环。 然后下一个步骤可以截断该计数器的数字加上我想要的许多有效数字。

例如,对于.000001234567812345678。 它会返回5个零。 如果我想要十位有效数字,我会做五+十= 15.程序将只保留十进制后的前15位数字,所以数字将被截断为0.000001234567812。

另一个想法可能是使用日志。 那么新号码提升到的能力将是有效数字前面的零的数量。

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

任何帮助将不胜感激!

编辑:这部分没有解决。

我觉得这样做很快,所以我会问这里的问题。 如果在20分钟左右没有回答,也许我会再发一个post。 为什么这不起作用?

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? 这应该将每个数字四舍五入为四位有效数字。

假设你的值在A2中,请尝试下面的任一个:

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

要么

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

从这里采取。

当已经有一个function给你你想要什么时,你为什么要循环?

 Sub Sample() Dim someNumber As Double '~~> .000001234567812345678 someNumber = 1.23456781234568E-06 '~~> This will give you .000001234567812 Debug.Print Round(someNumber, 15) End Sub 

如果3-(Int(Log(Range(“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 

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

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