注册

用【DM管理工具】执行SQL用的是四舍五入,而使用DmProvider.dll中参数值的小数进位用的是四舍六入五平分(银行家算法),导致数据差一分钱

龙卷风 2023/12/28 638 0

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】: DM8
【操作系统】:windows10
【CPU】:11th Gen Intel(R) Core(TM) i7-11700
【问题描述】*:用【DM管理工具】执行SQL用的是四舍五入,而使用DmProvider.dll中参数值的小数进位用的是四舍六入五平分(银行家算法),导致数据差一分钱。

下面是DmProvider.dll的版本,用的是dotNet中的net45下的DmProvider.dll文件
image.png

问题复现步骤:
1、在数据库上执行SQL
CREATE TABLE TE_YS_FBFX_HJ (F_ID DECIMAL(19,0) NOT NULL, F_RGHJ DECIMAL(20,2) NULL);
image.png
2、用DM管理工具执行SQL插件一条数据
insert into TE_YS_FBFX_HJ (F_ID, F_RGHJ)
values(1001, 1435.905);
image.png
3、用DM管理工具执行一个带参数的SQL插件一条数据
insert into TE_YS_FBFX_HJ (F_ID, F_RGHJ)
values(:pID, :pRGHJ);
image.png
4、使用Visual Studio引用DmProvider.dll,执行带参数的SQL
insert into TE_YS_FBFX_HJ (F_ID, F_RGHJ)
values(:pID, :pRGHJ);
image.png

5、执行SQL查看结果
select * from TE_YS_FBFX_HJ;
image.png

前两种方法采用四舍五入算法,保存的值为1435.91
最后一种方法采用了四舍六入五平分(银行家算法),保存的值为1435.90
期望DmProvider.dll参数值的方式也采用四舍五入,与直接执行SQL保持一致。

把DmProvider.dll反编译看了一下,应该是下面这行代码的问题
decimal.Round方法不是四舍五入,而是四舍六入五平分(银行家算法)
image.png

回答 0
暂无回答
扫一扫
联系客服