一直以来就为delphi的四舍五入非常苦恼,我一直用下面这个函数
function Round45_EX(GetOldCurr: Double;Digits: integer=2): Double;
var tmpCurr:Double;
begin
tmpCurr:= GetOldCurr * (IntPower(10,Digits)); // 小数点右移digits位
if Abs(Frac(tmpCurr)) < 0.5 then
tmpCurr:= Int(tmpCurr) // 保留整数部分
else
if tmpCurr>0 then
tmpCurr:= Int(tmpCurr)+1
else tmpCurr:= Int(tmpCurr)-1; // 进位
Result:= tmpCurr /IntPower(10,Digits); // 小数点回移
end;
但现在发现用round45_ex(3.765) = 3.77 是对的。
而我用两个double类型的变量比如 一个值为3 一个值为1.255,结果出来的记过就是3.76。
调试的时候发现传入round45_ex的值也是3.765,结果到if Abs(Frac(tmpCurr)) < 0.5 了,结果返回的值就是3.76了?各位有没有遇到类似的情况,如何解决啊
function Round45_EX(GetOldCurr: Double;Digits: integer=2): Double;
var tmpCurr:Double;
begin
tmpCurr:= GetOldCurr * (IntPower(10,Digits)); // 小数点右移digits位
if Abs(Frac(tmpCurr)) < 0.5 then
tmpCurr:= Int(tmpCurr) // 保留整数部分
else
if tmpCurr>0 then
tmpCurr:= Int(tmpCurr)+1
else tmpCurr:= Int(tmpCurr)-1; // 进位
Result:= tmpCurr /IntPower(10,Digits); // 小数点回移
end;
但现在发现用round45_ex(3.765) = 3.77 是对的。
而我用两个double类型的变量比如 一个值为3 一个值为1.255,结果出来的记过就是3.76。
调试的时候发现传入round45_ex的值也是3.765,结果到if Abs(Frac(tmpCurr)) < 0.5 了,结果返回的值就是3.76了?各位有没有遇到类似的情况,如何解决啊
解决方案 »
- 为何在TCusomGrid的Paint过程中第一行代码上下了断点,但在程序执行中不能产生中断?
- 怎么查找子窗体已经创建?
- 急!急!急!非常感谢!
- 有delphi调用flash的控件吗?
- VCL组件的图标问题
- 如何让标题栏里的内容动起来??
- ★★★★★后天过生日,又大一年了,还是一个人在外过生日,为什么我这么可怜?呜呜...呜...★★★★★
- 如何做演示盘?用什么工具?
- 问两个问题。十六进制和COM的控制。
- 几个小问题,送分送分!
- grid中实现增加checkbox,同时增加2列,新增的2列在数据库中实际字段,但可以输入数值。
- 如何将TDBGrid当前指示的一条记录赋值给TEdit控件??急...
http://community.csdn.net/Expert/topic/4592/4592417.xml?temp=5.511111E-02
function Round45_EX(GetOldCurr: Double;Digits: integer=2): Double;
var tmpCurr:Double;
begin
GetOldCurr:= GetOldCurr+0.0000000000001;
tmpCurr:= GetOldCurr * (IntPower(10,Digits)); // 小数点右移digits位
if Abs(Frac(tmpCurr)) < 0.5 then
tmpCurr:= Int(tmpCurr) // 保留整数部分
else
if tmpCurr>0 then
tmpCurr:= Int(tmpCurr)+1
else tmpCurr:= Int(tmpCurr)-1; // 进位
Result:= tmpCurr /IntPower(10,Digits); // 小数点回移
end;