怎样在DataColumn.Expression表达式中使用四舍五入,或者只舍不入,或者只入不舍的函数

ljmemail 2007-06-05 06:57:32
我要在datatable中定义一些公式列,公式中需要使用到四舍五入,或者只舍不入,或者只入不舍的函数,但是DataColumn.Expression不支持此类函数,请告人指点有没有什么方法能实现此需求。
...全文
851 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
linschangqian 2012-10-29
  • 打赏
  • 举报
回复
补充下:银行家算法的“四舍五入”是,当目标数是奇行偶不进,即 4.5 转换为 4,而 5.5 转换为 6。

Convert.ToInt32(浮点数)的是 舍入为最接近的 32 位有符号整数的 value。如果 value 为两个整数中间的数字,则返回二者中的偶数;即 4.5 转换为 4,而 5.5 转换为 6,也即。

加上0.00000001后,则不再是两个整数的中间数,满足了传统意义上的四舍五入。


linschangqian 2012-10-29
  • 打赏
  • 举报
回复
按理解:Convert.ToInt32(浮点数)应该是应用了银行家算法进行“四合五入”,所以才加上 0.000000001, 0.000000001不能影响精度,只是作为提升数据类型用,要调整的是将数据变回来的情况:
Convert((iUnitCost*iQuantity)*100+0.00000001,'System.Int32')/100.0
因为 整数99/整数100 的结果是整数零。
guomaodianzi 2012-04-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
自己解决了(精度为小数点后面两位),方法如下:
//四舍五入
adt.Columns[ "Salary3 "].Expression = "Convert(Salary1 * 100 + 0.000000001, 'System.Int32 ') / 100 ";
……
[/Quote]
我觉得需要修正下:
//四舍五入
adt.Columns[ "Salary3 "].Expression = "Convert(Salary1 * 100 + 0.1, 'System.Int32 ') / 100 ";
chenli133 2007-06-06
  • 打赏
  • 举报
回复
关注中...
ljmemail 2007-06-06
  • 打赏
  • 举报
回复
up
ljmemail 2007-06-06
  • 打赏
  • 举报
回复
自己解决了(精度为小数点后面两位),方法如下:
//四舍五入
adt.Columns["Salary3"].Expression = "Convert(Salary1 * 100 + 0.000000001,'System.Int32') / 100";

//只舍不入
adt.Columns["Salary4"].Expression = "Convert((Salary1 - 0.005 + 0.000000001) * 100,'System.Int32') / 100";

//只入不舍
adt.Columns["Salary5"].Expression = "Convert((Salary1 + 0.005 - 0.000000001) * 100,'System.Int32') / 100";
注意:
这里面如果不加0.000000001则0.125被“四舍五入”成0.12,
0.1251会才会被“四舍五入”成0.13的问题。

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧