关于数据库“五舍六入、单舍双入”的难题请教大家,望不吝解答。

zjsheng 2002-03-27 04:03:28
数据库里的四舍五入实在是太成问题了,我一直觉得很奇怪,难道大家都有幸没遇上这个怪现象,还是觉得太过小儿科而不屑一顾呢?

我设了小数点后保留2位,在实际输入时输入小数点后3位,程序自动四舍五入,太只完成一半,具体是这样的:

输入3.225 3.235 3.245 3.255 3.265
结果3.23 3.23 3.25 3.25 3.27

输入3.226 3.236 3.246 3.256 3.266
结果3.23 3.24 3.25 3.26 3.27

请教解决方法,不胜感激!!!(与系统区域设置无关)
...全文
170 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
东八泰 2002-04-01
  • 打赏
  • 举报
回复
我是读化工的,好象分析化学里也是这么取舍的。
Roy123 2002-04-01
  • 打赏
  • 举报
回复
hong_qi(洪_七),你用的可能是float类型(16位时),如果用double类型的话,应该不会出现此情况。win95以后环境的float类型也是32位的,也不会出现误差。
Roy123 2002-04-01
  • 打赏
  • 举报
回复
alphapaopao(炮炮(斯宾诺莎)) 与phoenixdz()没有矛盾,是 phoenixdz()理解错了。
单舍双入是指,当“入了以后”能够“凑成双数”,那么就入,否则就舍去。
我是国内上的学,“概率与统计”或“误差理论”课程上是这么说的。
Roy123 2002-04-01
  • 打赏
  • 举报
回复
alphapaopao(炮炮(斯宾诺莎)) 与 phoenixdz()的没有矛盾啊,是phoenixdz理解错了。
单舍双入是指,当“入了以后”能够凑“成双数”,那么就入,否则就舍去 。
我是国内上的学,概率课程中是这样说的。






hong_qi 2002-04-01
  • 打赏
  • 举报
回复
我在用bc3.1编写dos程序的时候也有这个问题,所以我猜想
这与数据库无关,应该是由浮点数在机器内的表示方法的精确度
造成的,你输入2.235,计算机内可能保存成2.234999999999,
所以没能进位。我不是学计算机专业的,以上只是猜想。
我的解决办法是:大于零的数,加上0.000001,小于零的数,
减去0.000001,(大点小点都可以,取决于你要求的精度)。
zjsheng 2002-04-01
  • 打赏
  • 举报
回复
先总结一下:
1、国外遵循单舍双入(当尾数为5时),只不知“斯宾诺莎”是在哪所学校就学的?
2、phoenixdz所说的又与“斯宾诺莎”相反,不知Oracle的设计师们又是在哪所学校就学的。 呵呵...
3、我试过在输入与输出时使用格式化,但是不成功,应该直接与数据库本身设定有关。
4、MONEY类型在database desktop中可以实现四舍五入,但到了程序里使用DBEdit修改数据里又变成我所说的那样了,怎么回事?
5、BCB5.0的补丁是否可以解决这个问题?(给否给个下载链接)
6、估计是BDE里的设置,谁知道BDE ADMINISTRATOR里的CONFIGURATION中的init、formats怎么设置吗?应该是这里的。

多谢各位的帮忙,我打算再等两天,若实在没有根本的解决办法的话就结贴了。
yestoyes 2002-04-01
  • 打赏
  • 举报
回复
我刚在VFP中试了一下,没这问题,你不是说是程序自动取舍的吗?!vfp不是有round()吗?不明白!
phoenixdz 2002-03-31
  • 打赏
  • 举报
回复
我用Oracle8.16试了一下,怎么是 双舍单入
即:
输入3.225 3.235 3.245 3.255 3.265
结果3.22 3.24 3.24 3.26 3.26

怎么回事阿?
rd_software 2002-03-30
  • 打赏
  • 举报
回复
用ado就可以了,bde有问题,我遇到过。
要不然你就把字段类型设置为money类型的字段。
alphapaopao 2002-03-30
  • 打赏
  • 举报
回复
我在学校里面学的:

单舍双入,是这么解释的,当“入”了以后能够凑成双数,那么就入,否则就舍去
imdt 2002-03-30
  • 打赏
  • 举报
回复
llllllllllllll
CCLIS 2002-03-29
  • 打赏
  • 举报
回复
在数据库中的记录不一定要四舍五入,只要在输出时做到就行了。

使用格式化输出好了。
zsr 2002-03-28
  • 打赏
  • 举报
回复
用FormatFloat,可实现四舍五入,但还要用一次StrToFloat!
^_^
zengshengbo 2002-03-28
  • 打赏
  • 举报
回复
这个问题确实存在,记住,在存取字段值的时候,用AsVarent,可以解决
zjsheng 2002-03-28
  • 打赏
  • 举报
回复
那应该是没上补丁之故,可为何6.0里也是这样的呢?

何处可下载到补丁呢?望告知,谢谢!
caoguangxin 2002-03-28
  • 打赏
  • 举报
回复
咦,怎么我试的结果和你的不一样呢?

输入3.225 3.235 3.245 3.255 3.265
结果3.23 3.24 3.25 3.26 3.27

好象没有你说的那个问题哎,我用的是BCB5.0+补丁,操作系统是Win2000,数据表是用Paradox。
zygtp 2002-03-28
  • 打赏
  • 举报
回复
double Round(double Value,int P)
{
int Result=int(Value);
double Tmp=Value-Result;

if(Tmp==0)return Value;
for(int i=0;i<P;i++)Tmp*=10;
if(Value>0)
Tmp=int(Tmp+0.5);
else
Tmp=int(Tmp-0.5);

for(int i=0;i<P;i++)Tmp/=10;
return Result+Tmp;
}
zjsheng 2002-03-27
  • 打赏
  • 举报
回复
caoguangxin(广昕):

你的办法确实可取,但我想堂堂宝兰应该不会有这种低级错误吧,还是说国外的财务部门的“四舍五入”跟中国的不一样(:)?

所以我认为可以通过更改一些设置来纠正它。

BTW:谁知道BDE ADMINISTRATOR里的CONFIGURATION中的init、formats怎么设置吗?应该是这里的。
caoguangxin 2002-03-27
  • 打赏
  • 举报
回复
哦,错啦,不好意思,应该是int((x+0.005)*100)/100
x=2.353,int((x+0.005)*100)/100=int(2.358*100)/100=int(235.8)/100=235/100=2.35
LuoGD 2002-03-27
  • 打赏
  • 举报
回复
解决办法与具体的数据库相关
加载更多回复(6)

1,178

社区成员

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

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