[四舍五入]你一定认为没问题,但是...可能是个巨大Bug?
********************************************************
四舍五入问题探讨
********************************************************
本人预进行精确到两位小数的四舍五入运算,遇到麻烦,问题报告如下
(x:double,s:double 或string)
1.用Round函数
测试数据如下
s:= Round(x*100)/100
x=1.005 s=1.00(有误)
x=10.005 s=10.01
x=100.005 s=100.00(有误)
...以下同...
2.用FormatFloat函数
测试数据如下
s:= FormatFloat('0.00',x);
x=1.005 s=1.00(有误)
x=10.005 s=10.01
x=100.005 s=100.01
x=1000.005 s=1000.01
x=10000.005 s=10000.00(有误)
...类推...
x=1000000000000.005 s=1000000000000.00(有误)
3.采用网友CherioBoy(冲锋不止) 的函数Round45
// 实数取四舍五入,使用 myCurrency:=Round45(myCurrency,2)
function Round45(GetOldCurr: Currency;Digits: integer=2): Currency;
var tmpCurr:Currency;
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;
测试结果如下:
s:=Round45(x,2);
x=1.005 s=1.01
x=10.005 s=10.01
x=100.005 s=100.01
x=1000.005 s=1000.01
x=10000.005 s=10000.01
...类推...
x=1000000000000.005 s=1000000000000.00
以上都正确,但是继续测试该通用函数
s:= Round45(x,4) //精确到四位小数
x=1.00045 s=1.0004(有误)??????
x=1.000451 s=1.0005(正确)
(********************************************************
我的问题:
********************************************************)
1.哪里找真正的四舍五入函数啊,有谁可以告诉我???
2.这个问题仅仅是Delphi中存在吗???
3.那位网友也有类似的经历,您是怎么解决的
4.这是不是个Bug???
联系mail: leemingsong@sina.com
答谢!
********************************************************