VB中Decimal数值四舍五入结果不符,如何正确实现?
解决Decimal.Round四舍五入不符合预期的问题
我明白你遇到的困惑——明明是13.946,用Decimal.Round(valox, 2, MidpointRounding.AwayFromZero)却得到13.94,这确实有点反直觉。咱们一步步拆解问题,找到解决方案:
核心原因:数值的精确性问题
大概率是你的valox变量并没有精确存储13.946。如果这个数值是从Double等浮点数类型转换过来的,就会出现精度丢失——因为二进制浮点数无法精确表示很多十进制小数,比如13.946作为Double存储时,实际是一个略小于13.946的近似值,转成Decimal后就变成了类似13.94599999999999...的数值,这时候四舍五入到两位小数自然会得到13.94。
针对性解决方案
1. 直接使用Decimal字面量赋值
如果是手动赋值,一定要给数值加上D后缀,明确指定为Decimal类型,确保数值精确:
Dim valox As Decimal = 13.946D Dim roundedVal As Decimal = Decimal.Round(valox, 2, MidpointRounding.AwayFromZero) ' 此时roundedVal的结果就是13.95
2. 从字符串直接转换(避免浮点数中转)
如果数值来自用户输入或字符串,不要先转成Double再转Decimal,直接用字符串转换方法:
Dim valStr As String = "13.946" Dim valox As Decimal If Decimal.TryParse(valStr, valox) Then Dim roundedVal As Decimal = Decimal.Round(valox, 2, MidpointRounding.AwayFromZero) ' 结果为13.95 End If
3. 修正计算导致的微小精度误差
如果数值是通过复杂计算得到的,存在极小的精度偏差,可以先给数值加一个极小的Decimal值再进行四舍五入:
Dim valox As Decimal = ' 你的实际计算结果(略小于13.946的数值) Dim adjustedVal As Decimal = valox + 0.0000000001D Dim roundedVal As Decimal = Decimal.Round(adjustedVal, 2, MidpointRounding.AwayFromZero)
补充说明
Decimal本身是高精度的定点数类型,但它的精确性依赖于初始值的来源。只要确保你的Decimal变量存储的是精确的13.946,而不是近似值,MidpointRounding.AwayFromZero模式下的四舍五入就会按照预期得到13.95。
内容的提问来源于stack exchange,提问作者JOHN Doe
相关产品推荐
相关产品推荐

