VBA中Round函数保留1位小数出现浮点错误的问题咨询
问题原因与解决办法
原因
这是单精度浮点数(Single类型)的精度限制导致的:
- Single类型只有约7位有效数字的精度,很多十进制小数(比如2.183333、2.2)无法被二进制浮点数精确存储,底层实际是一个接近目标值的近似值。
- 当你用
Round(ttime, 1)处理Single类型的2.183333时,得到的"2.2"其实是Single能表示的最接近2.2的近似值,这个值在转换为Excel单元格默认的Double类型后,就会显示出底层的微小误差(2.20000004768371)。
解决办法
有两种简单的处理方式,按需选择:
1. 提升精度后再计算
把Single类型的ttime转换为Double类型(精度更高,约15-17位有效数字)再执行Round操作,这样得到的结果更接近精确的十进制2.2:
mysheet.Cells(row, ctotal).Value = Round(CDbl(ttime), 1)
2. 设置单元格数字格式强制显示1位小数
如果只是显示问题,不需要修改底层存储值,可以直接给单元格设置数字格式,让它强制显示1位小数,这样不管底层的微小误差,用户看到的都是2.2:
mysheet.Cells(row, ctotal).Value = Round(ttime, 1) mysheet.Cells(row, ctotal).NumberFormat = "0.0"
你也可以把两种方法结合起来,既保证底层值的精度,又控制显示效果。
内容的提问来源于stack exchange,提问作者Jacob Shaw
相关产品推荐
相关产品推荐

