Delphi里小数超过20位后的问题!

arraiy 2006-12-07 05:08:51
问题如下:
var
sum: Extended;
begin
sum := 0.0;
sum := sum + table1.FieldByName('aaa').AsFloat / (1 - table2.FieldByName('bbb').AsFloat / 100) * 3000;
end;

代入数值也就是:
sum := 0.0 + 0.52269 / (1 - 2 / 100) * 30000;
实际用系统自带的计算器得到的值是:16000.714285714285714285714285714
可是在程序里面就变成只有6位小数位了,也就是16000.714286
我的数据集里面的字段是保留的6位小数,不会计算过后也是按6位来截取吧?这样算的话我后面那么多小数位全丢了,就不准确了,变量sum我用Real型也是这样,Extended类型不是可以保留19-20位小数吗?怎么会这样呢?

各位大哥,有没有遇到过?怎么解决呀?
...全文
262 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
arraiy 2006-12-08
  • 打赏
  • 举报
回复
数据集的EnableBCD属性已经设置为false了,为True的话就只有4位小数,现在有6位了,现在是计算过后的值Sum有问题,它是个变量啊,我又没有给它定义小数位,为什么它自己截了只有6位了呢?
marf_cn 2006-12-08
  • 打赏
  • 举报
回复
没遇到过,也许是delphi类型的bug
shun3 2006-12-08
  • 打赏
  • 举报
回复
把对应的数据集的EnableBCD属性设置为false,再重新加入数据字段就可以了
arraiy 2006-12-08
  • 打赏
  • 举报
回复
关键是在程序里面计算后sum的值就只有6位了
是这样子的,用下面的代码计算:
var
sum: Extended;
begin
sum := 0.0;
sum := sum + table1.FieldByName('aaa').AsFloat / (1 - table2.FieldByName('bbb').AsFloat / 100) * 3000;
end;
其中:
table1.FieldByName('aaa').AsFloat = 0.52269
table2.FieldByName('bbb').AsFloat = 2
最后结果是:16000.714286

可是我用计算器算:0.52269 / (1 - 2 / 100) * 3000;
结果就是:16000.714285714285714285714285714

现在我的意思就是:程序里面算的它自动给我把后面的截掉了,怎么让系统不要截掉后面的数据啊?

我用了下面的方法:
1、把数据集里面字段的精确改成38位30位小数再用上面的代码计算;
2、用一个Extended类型(该类型可以精确到19-20位小数)的变量,把0.52269赋给它,然后再用这个变量来参与计算,sum也是Extended类型;
3、用RoundTo(结果,-10)来取小数位

这几种方法都试了,都不行,还是原来的6位不变。

怎么回事呀?高手们求救!!!
liuhelin 2006-12-07
  • 打赏
  • 举报
回复
另外real这些类型是带精度的也就是说是不精确的,integer是没有精度的所以是精确的
liuhelin 2006-12-07
  • 打赏
  • 举报
回复
16000.714286??
你指定显示格式小数点后面多些位看看是16000.7142860000000000000000000000000000吗
arraiy 2006-12-07
  • 打赏
  • 举报
回复
另外我这样试过:
直接把数值代入程序里,也就是把:
sum := sum + table1.FieldByName('aaa').AsFloat / (1 - table2.FieldByName('bbb').AsFloat / 100) * 3000;
换成:
sum := 0.0 + 0.52269 / (1 - 2 / 100) * 30000;
结果会是科学计数法表示的值,为什么我用数据集字段的值来算,就自动给我截掉了呢?

2,498

社区成员

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

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