Delphi 通过AdoQuery 操作SQL Server中Numeric字段小数未被截断问题

drizzle_yu 2015-05-04 08:44:57
Sql server 中的本来有自动舍入的功能,可通过Delphi Tadoquery操作的时候却不四舍五入,直接按小数位截断,有什么好的处理方法?

如:字段 numeric(18, 2) 赋值 15.5286 最后值为15.52 ,而不是按四舍五入存储为15.53
...全文
431 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
drizzle_yu 2015-05-28
  • 打赏
  • 举报
回复
结贴啦,用Money或程序中处理后存数据库,没简便方法
丨imgeek丨 2015-05-14
  • 打赏
  • 举报
回复
用 round
DelphixpeFan 2015-05-11
  • 打赏
  • 举报
回复
功能说明:对一个实数进行四舍五入。(按照银行家算法) 例: var i, j: Integer; begin i := Round(1.5); // i等于2 j := Round(2.5); // j等于2 end; 在Delphi中使用Round函数得到的答案有时与我们所预期的会不太一样:采用的是四舍六入五留双。即当舍或入位大于或小于五时按四舍五入来处理 ,而当舍或入位等于五时,就要看前面一位是什么,根据奇进偶不进,它总是返回一个偶数值。 例: i:= Round(11.5)//i等于12 i:= Round(10.5)//i等于10 这种Round其实是按照银行家算法,统计学上一般都用这种算法,比传统的"四舍五入"要科学。 如果要使用传统的"四舍五入"方法,可以使用下面函数: function RoundClassic(R: Real) 2.trunc(取得X的整数部分) 如:trunc(-123.55)=-123, floor(123.55)=123 3.ceil(取得大于等于X的最小的整数) 如:ceil(-123.55)=-123, ceil(123.15)=124 4.floor(取得小于等于X的最大的整数) 如:floor(-123.55)=-124,floor(123.55)=123
lyhoo163 2015-05-09
  • 打赏
  • 举报
回复
Moeny类型 ,比较好。
doloopcn 2015-05-09
  • 打赏
  • 举报
回复
引用 5 楼 drizzle_yu 的回复:
拼音输入法造成歧义了,题目应该是 字段小数 被截断问题 因为SQL Server处理是正确了,用企业管理器都会四舍五入,就Delphi里面操作就会截断溢出尾数,真是比较奇怪! 字段比较多,每个字段都用Round处理是可以但是很麻烦,能不能修改Ado控件哪里解决这个问题? 我发现Float和Money类型不会存在这个问题,实在不行就换成Moeny类型了。
TBCDField为什么不用呢?这个是我认为最好用的 aField.AsBCD不就好了,这是专门为NUMERICA 字段设计的啊
不得闲 2015-05-06
  • 打赏
  • 举报
回复
那就自己先处理好,然后再写进去咯。
踏雪无痕 2015-05-06
  • 打赏
  • 举报
回复
就使用Moeny类型挺好的
drizzle_yu 2015-05-06
  • 打赏
  • 举报
回复
拼音输入法造成歧义了,题目应该是 字段小数 被截断问题 因为SQL Server处理是正确了,用企业管理器都会四舍五入,就Delphi里面操作就会截断溢出尾数,真是比较奇怪! 字段比较多,每个字段都用Round处理是可以但是很麻烦,能不能修改Ado控件哪里解决这个问题? 我发现Float和Money类型不会存在这个问题,实在不行就换成Moeny类型了。
蓝色光芒 2015-05-06
  • 打赏
  • 举报
回复
Round才复合楼主的意思 Round(n*100)/100
lyhoo163 2015-05-05
  • 打赏
  • 举报
回复
你可以在保存表的一行值时,通过函数Trunc()取整解决。大致代码: var X:double; FieldByName('字段名').asFloat:=Trunc(X*100)/100;
doloopcn 2015-05-05
  • 打赏
  • 举报
回复
对于SQL SERVER来说应该没有方法,对于DELPHI来说是有的: Result:=Trunc(theNumeric*100)/100 上面的代码可以插入到FIELD的OnSetText事件中自动处理 ADOQuery1TestFieldSetText(Sender: TField; const Text: string); begin Sender.Value:=Trunc(StrToFloat(Text)*100)/100; end;
bdmh 2015-05-05
  • 打赏
  • 举报
回复
你自己先处理好,再存数据库吧

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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