为何VBA中Decimal类型计算结果小数位数少一位?
VBA小数位数缺失的原因
问题场景
你在VBA里执行这段代码:
Dim mp as Decimal mp = 2056834 / 36 MsgBox(mp, vbInformation)
实际输出为57134.2777777778,但预期输出是57134.27777777778,少了一位小数。
核心原因
- 除法运算的类型限制:VBA中的
/是浮点除法,返回结果为Double类型。Double属于二进制浮点格式,无法精确表示2056834/36这种无限循环的十进制小数,计算时已经被近似为Double能存储的最接近值,精度在此步已经损失。 - Decimal变量无法恢复丢失的精度:虽然你将结果赋值给了
Decimal类型变量(Decimal支持更高的十进制精度),但原始除法结果已经是Double的近似值,Decimal无法找回已经丢失的精度。 - MsgBox的显示规则:MsgBox在显示数值时,默认按Double的精度格式化输出,最多显示15位左右的有效数字,最后一位会做四舍五入,因此你看到的结果比预期少了一位小数。
精准计算的解决方法
如果要保留完整的十进制精度,需要用CDec将运算数转换为Decimal类型后再计算,绕过Double的精度限制:
Dim mp As Decimal mp = CDec(2056834) / CDec(36) MsgBox mp, vbInformation
内容的提问来源于stack exchange,提问作者skidl0ck
相关产品推荐
相关产品推荐

