round()--没有四舍五入的问题????--无穷大奇怪问题!!

lonking 2003-12-10 03:31:54
在开发中遇到很奇怪的问题,问了很多人都不知道,特向高手请教:
double vdJxll , vdtmp1, vdLxje
long vlJxts, vlNxts

........
//计算vdJxje 、vdJxll 、vlNxts 、vlJxts
....
...
//过程中vdJxje 、vdJxll 、vlNxts 、vlJxts经过round() 处理
.....

vdtmp1 = vdJxje * (vdJxll / 100 / vlNxts ) * vlJxts
vdLxje = round(vdtmp1 , 2)

-------------------------
问题:最后结果 vdtmp1 =9284375.465, 但是vdLxje =9284375.46 并没有四舍五入(没有得到需要的数值9284375.47)

多谢各位!
...全文
98 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiongxiao 2003-12-12
  • 打赏
  • 举报
回复
计算机进行浮点运算是有误差的,碰上这样的情况可以考虑加上一个几乎可以忽略不计的小数。
你可以试试:最后结果 vdtmp1 =9284375.465, 再加上0.0000001,然后四舍五入看看对不对。
bunnysky 2003-12-11
  • 打赏
  • 举报
回复
同意楼上的!
klbt 2003-12-10
  • 打赏
  • 举报
回复
提出一种异想天开的可能性,楼主检测一下:
vdtmp1 的真实数值是9284375.4645 ~ 9284375.4649
显示取3位小数为9284375.465,但是如果直接四舍五入到小数点两位,那么vdLxje =9284375.46就是正确的。
TGWall 2003-12-10
  • 打赏
  • 举报
回复
还有,你要注意一下在执行后vdLxje = round(vdtmp1 , 2) 后,会不会在其他地方有代码再给vdLxje 赋值
TGWall 2003-12-10
  • 打赏
  • 举报
回复
用如下的方法测试了一下, 没问题:
double ldb_firnum=9284375.465
double ldb_latnum
ldb_latnum=round(ldb_firnum,2)
messagebox("",string(ldb_latnum))
//ldb_latnum确实是9284375.47

-------------
你确定 vdtmp1 = vdJxje * (vdJxll / 100 / vlNxts ) * vlJxts中的vdtmp1是9284375.465了吗? 用个messagebox看看它的值



GoldProgramer 2003-12-10
  • 打赏
  • 举报
回复
还有可能是版本问题,升级到最新版试试。
jdsnhan 2003-12-10
  • 打赏
  • 举报
回复
测试如下
messagebox("",string(round(9284375.465,2)))没问题。
同意楼上的方法,转换成dec看看。
mittee 2003-12-10
  • 打赏
  • 举报
回复
我用decimal没有这种问题
GoldProgramer 2003-12-10
  • 打赏
  • 举报
回复
试试:
vdLxje = dec(string(vdtmp1, '#.00'));
chrisfy 2003-12-10
  • 打赏
  • 举报
回复
round()的返回值类型是decimal,按一楼的方法试试,不行就再把问题说得详细一些!
workhand 2003-12-10
  • 打赏
  • 举报
回复
没遇到过,像楼上说的试试
huangxinru 2003-12-10
  • 打赏
  • 举报
回复
数据类型换成decimal试一下

1,079

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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