Delphi 通过AdoQuery 操作SQL Server中Numeric字段小数未被截断有关问题
Delphi 通过AdoQuery 操作SQL Server中Numeric字段小数未被截断问题
Sql server 中的本来有自动舍入的功能,可通过Delphi Tadoquery操作的时候却不四舍五入,直接按小数位截断,有什么好的处理方法?
如:字段 numeric(18, 2) 赋值 15.5286 最后值为15.52 ,而不是按四舍五入存储为15.53
------解决思路----------------------
对于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;
------解决思路----------------------
你自己先处理好,再存数据库吧
------解决思路----------------------
你可以在保存表的一行值时,通过函数Trunc()取整解决。大致代码:
var X:double;
FieldByName('字段名').asFloat:=Trunc(X*100)/100;
------解决思路----------------------
Round才复合楼主的意思
Round(n*100)/100
------解决思路----------------------
就使用Moeny类型挺好的
------解决思路----------------------
那就自己先处理好,然后再写进去咯。
------解决思路----------------------
TBCDField为什么不用呢?这个是我认为最好用的
aField.AsBCD不就好了,这是专门为NUMERICA 字段设计的啊
------解决思路----------------------
Moeny类型 ,比较好。
------解决思路----------------------
功能说明:对一个实数进行四舍五入。(按照银行家算法)
例:
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
------解决思路----------------------
用 round
Sql server 中的本来有自动舍入的功能,可通过Delphi Tadoquery操作的时候却不四舍五入,直接按小数位截断,有什么好的处理方法?
如:字段 numeric(18, 2) 赋值 15.5286 最后值为15.52 ,而不是按四舍五入存储为15.53
------解决思路----------------------
对于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;
------解决思路----------------------
你自己先处理好,再存数据库吧
------解决思路----------------------
你可以在保存表的一行值时,通过函数Trunc()取整解决。大致代码:
var X:double;
FieldByName('字段名').asFloat:=Trunc(X*100)/100;
------解决思路----------------------
Round才复合楼主的意思
Round(n*100)/100
------解决思路----------------------
就使用Moeny类型挺好的
------解决思路----------------------
那就自己先处理好,然后再写进去咯。
------解决思路----------------------
TBCDField为什么不用呢?这个是我认为最好用的
aField.AsBCD不就好了,这是专门为NUMERICA 字段设计的啊
------解决思路----------------------
Moeny类型 ,比较好。
------解决思路----------------------
功能说明:对一个实数进行四舍五入。(按照银行家算法)
例:
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
------解决思路----------------------
用 round