VBA round(var,1) 导致浮点错误

VBA round(var,1) results in floating point error

提问人:Jacob Shaw 提问时间:5/11/2023 更新时间:5/11/2023 访问量:76

问:

我正在使用VBA计算值并将其打印到工作表中。计算值是“单个”,我想将其四舍五入到小数点后一位。出于某种原因,“round”函数四舍五入到最接近的小数点,但它仍然有看起来像浮点误差的东西。我可以手动修复此问题,但我宁愿不必每次都这样做,并且想知道实际发生了什么。

我使用了以下代码。

mysheet.Cells(row, ctotal).Value = Round(ttime, 1)

在一个示例中,ttime 为 2.183333,相应单元格中打印的值为 2.20000004768371。我希望它在这种情况下打印“2.2”,此后没有其余的废话。有什么想法吗?

Excel VBA 浮点舍 精度

评论

1赞 Tim Williams 5/11/2023
您可以通过设置单元格格式来控制值的显示方式。
0赞 Gustav 5/11/2023
Round众所周知,这是有问题的。这在我的库中得到了解决,用于精确舍入:VBA。圆形
0赞 Lutz Lehmann 5/11/2023
您想要的是显示包含四舍五入数字的字符串。你要做的是将数字转换为数字,结果并不完全可表示。因此,您可以在单元格中获得最接近的可表示数字。您仍然可以调整单元格将数字转换为字符串的方式,就像在答案中一样(但这样您就不需要之前四舍五入了)。请参阅“相关” - “浮点数学是否损坏?
0赞 BigBen 5/11/2023
@LutzLehmann - 我认为你不是故意在这里使用“字符串”。 或者显然不返回字符串,也不会将基础值转换为字符串。RoundWorksheetFunction.Round.NumberFormat

答:

2赞 BigBen 5/11/2023 #1

我会使用 ,因为 Round 使用庄家舍入。WorksheetFunction.Round

作为副作用,返回的结果是:WorksheetFunction.RoundDouble

Dim ttime As Single
ttime = 2.183333
    
Debug.Print TypeName(Round(ttime, 1)) ' returns Single
Debug.Print TypeName(WorksheetFunction.Round(ttime, 1)) ' returns Double

如果您确实想要银行家四舍五入,那么:

Round(CDbl(ttime), 1)

您可以通过更改单元格的 :.NumberFormat

mysheet.Cells(row, ctotal).NumberFormat = "0.0"