为什么生成的 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)
吗?非常感谢。
您的问题源于
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将字符串识别为数字,并且“有帮助地”将其转换回数字
根据最新的 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
如您所见,在上述 VBA Round 的情况#2 中,将一半向下舍入为 2。但是,如果您通过 Application.WorksheetFunction.Round 运行情况#2,则一半将向上舍入为 3。因此,如果您确实需要 VBA 代码来实现单元格内 Round() 函数的精确舍入结果,我强烈建议您使用 Application.WorksheetFunction.Round 而不是实际的 VBA Round。