SSRS表达式为变量赋值时小数金额被自动四舍五入如何解决
SSRS报表变量自动四舍五入取整问题修复
问题说明
- 业务逻辑:从数据库读取金额存入报表变量,或根据字段判定条件对现有变量值累加金额后更新变量,最终将变量值输出到文本框展示
- 异常现象:变量存储的数值被自动四舍五入为整数,但文本框格式设置为保留两位小数,导致展示结果与实际计算值存在整数偏差
- 原始问题表达式:
=IF(Fields!APBAC_AMOUNT.Value > 0 And Fields!APBAC_TYPE.Value = "AP" Or Fields!APBAC_TYPE.Value = "BD", Variables!rptBalance.setValue(Variables!rptBalance.Value + Fields!AMOUNTRECEIVED.Value) And Variables!rptBalance.Value, Variables!rptBalance.setValue(Fields!APBAC_BALANCE.Value) AND Fields!APBAC_BALANCE.Value)
注:SSRS表达式中条件判断函数为IIF,原始代码写为IF也会触发兼容问题
问题根因
- 变量类型配置错误:新建报表变量时如果未手动指定数据类型,SSRS会根据初始赋值自动推断类型,若初始值为整数,变量会被固定为
Integer整数类型,后续所有赋值、累加操作都会被自动四舍五入为整数存储 - 表达式语法错误:用逻辑运算符
And拼接setValue方法调用和返回值,And在SSRS的VB表达式中仅用于逻辑/按位运算,不能作为语句分隔符。该写法会让SSRS把setValue返回值、后续变量值都隐式转换为布尔类型做逻辑运算,运算结果再转回数值,过程中直接丢失所有小数位 - 判断逻辑优先级错误:
And运算优先级高于Or,原始判断条件实际执行逻辑为(APBAC_AMOUNT>0 且类型为AP) 或 (类型为BD),只要类型是BD不管金额是否大于0都会走累加分支,不符合预期的「金额大于0且类型为AP/BD才累加」的规则
修复步骤
- 修正变量数据类型:打开报表变量设置面板,找到
rptBalance变量,手动将数据类型设置为Decimal(高精度小数,适合金额计算),初始值设置为0D(明确指定为Decimal类型零值,避免SSRS自动推断为整数类型) - 重写表达式:修正判断条件的优先级、替换错误的
And拼接语法、所有金额值显式用CDec()转为Decimal类型,避免隐式类型转换导致的取整,修正后代码如下:
=IIF( Fields!APBAC_AMOUNT.Value > 0 And (Fields!APBAC_TYPE.Value = "AP" Or Fields!APBAC_TYPE.Value = "BD"), ( Variables!rptBalance.SetValue( CDec(Variables!rptBalance.Value) + CDec(Fields!AMOUNTRECEIVED.Value) ): CDec(Variables!rptBalance.Value) ), ( Variables!rptBalance.SetValue(CDec(Fields!APBAC_BALANCE.Value)): CDec(Fields!APBAC_BALANCE.Value) ) )
- 校验文本框格式:选中文本框,在数字格式设置中选择「数字」或「货币」类型,手动设置小数位数为2,避免常规格式下的展示异常
注意:SSRS表达式中做金额类计算时,不要依赖系统自动类型推断,所有参与运算的字段值、变量值都显式用
CDec()转为Decimal类型,从根源上避免混合类型运算触发的隐式取整问题。
内容的提问来源于stack exchange,提问作者Doug
相关产品推荐
相关产品推荐

