导航
  • 主页
  • API 调用
  • 基础类
  • 控件与界面
  • 数据库相关
  • DataWindow
  • 项目管理
  • Web 应用
  • 脚本语言

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)

多谢各位!
...全文
20 点赞 收藏 12
写回复
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试一下
回复
发动态
发帖子
PowerBuilder
创建于2007-09-28

813

社区成员

PowerBuilder 相关问题讨论
申请成为版主
社区公告
暂无公告