圆形和工作表功能.圆形

问题描述 投票:0回答:2

为什么生成的 A1 (0.224) 和 B1 (0.224000006914139) 不同?

Sub a()
Cells(1, 1) = Application.WorksheetFunction.Round(Rnd(-1), 4)
Cells(1, 2) = Round(Rnd(-1), 4)
Cells(1, 3) = "=a1=b1"
Cells(1, 4) = "'0.2240"
End Sub

如何复制 B1 并粘贴到 D1(保留四位小数)而不丢失尾随零?我可以用

"'0.2240"
rnd(-1)
来更改最后一个
cells(1,2)
吗?非常感谢。

excel vba rounding
2个回答
3
投票

您的问题源于

Rnd
返回数据类型
Single
看这里

Round
传递
numdecimalplaces
> 0 和
Single
值时,它遵循该数据类型,并返回
Single
WorksheetFunction.Round
则不然:它返回一个双精度值。 (如果
Round
传递给
Double
,则返回
Double

这并不重要 在 VBA 本身内(请参阅下面的观察窗口图像以获取证据)

当将值放置在 Excel 单元格中并将其转换为 Excel 的单元格数据类型时,会出现此问题。

Single
的转换会产生浮点精度问题

要解决此问题,您的代码可以是

Cells(1, 2) = Round(CDbl(Rnd(-1)), 4)

要将结果放入

Cell(1, 4)
作为文本,您可以使用

Cells(1, 4) = "'" & Format(Cells(1, 2), "0.0000")

Cells(1, 4) = "'" & Cells(1, 2).Text

注意:

"'" &
是必需的,因为Excel将字符串识别为数字,并且“有帮助地”将其转换回数字


0
投票

根据最新的 Microsoft 文档,VBA Round 函数确实可以返回与 Application.WorksheetFunction.Round 方法不同的结果。以下是 Microsoft 在 Round 函数的文档中对此的解释:

此 VBA 函数返回通常称为银行家的内容 四舍五入。所以使用这个功能之前要小心。了解更多 可预测的结果,请使用 Excel VBA 中的工作表舍入函数。

这是一个示例,说明即使所有数值都设置为 Double,VBA Round 函数舍入结果也可能是多么奇特:

这是一段代码,其中所有数值均为 Double 格式:

WeightNetto = rngArticleCell.Offset(, 8).Value2 Quantity23 = rngArticleCell.Offset(, -4).Value2 If Quantity23 <> 0 Then WeightPerUnit = WeightNetto / Quantity23 RndWeightPerUnit = Round(WeightPerUnit, 3) Else WeightPerUnit = 0 End If

舍入案例#1:

舍入案例#2:

如您所见,在上述 VBA Round 的情况#2 中,将一半向下舍入为 2。但是,如果您通过 Application.WorksheetFunction.Round 运行情况#2,则一半将向上舍入为 3。

因此,如果您确实需要 VBA 代码来实现单元格内 Round() 函数的精确舍入结果,我强烈建议您使用 Application.WorksheetFunction.Round 而不是实际的 VBA Round。

© www.soinside.com 2019 - 2024. All rights reserved.