首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

问一个很简单的有关问题,计算不正确

2012-03-18 
问一个很简单的问题,计算不正确var je,qz:realbeginje:0.3qz:trunc(je/0.1)end为什么以上代码中的qz

问一个很简单的问题,计算不正确


var je,qz:real;
begin
 je:=0.3;
 qz:=trunc(je/0.1);
end;

为什么以上代码中的qz等于2,而不是3

有什么强制的方法转换吗?

[解决办法]
应该是浮点数0.1比0.1略微大了一些。
[解决办法]
是应为浮点数的特殊存储规则所致,浮点数不是精确的数
[解决办法]
var je,qz: double; //real 建议不用,用double更合适。
begin
 je:=0.3;
 qz:=trunc( je * 10 + 0.5);//这儿补多少,就取决于你要精确到哪一位。
 showmessage( floattostr( qz));
end;
[解决办法]
另外,一般地为了减少这种精度问题带来的影响,相应的参数值可以用 整数 来表示。
如:

Delphi(Pascal) code
var je,qz:double;x:Integer;y:double;begin//  je:=0.3;//  je := je *10 + 0.5;//  qz := trunc( je  );//  ShowMessage(floattostr(qz));//这儿是放大了100倍的原始数据。这样做的好处,不解释。。。。。  x := 30;  y := x / 100;  ShowMessage(floattostr(y));//显示为 0.3 end;
[解决办法]
trunc本身就是截断取整数位,所以这里应该先乘后除或者用round进行小数位舍入 避免出现2.99999之类的问题
[解决办法]
如楼上和位说的,浮点数不是精确的数,
比如浮点数5(不是整数),可能表示为4.99999999 或者4.9999999998等等

所以最好处理一下,加个误差
qz:=trunc(je/0.1+0.0000005);
[解决办法]
难道是DELPHI的又一个BUG?

热点排行