var d1,d2:real;
begin
d1:=11;d2:=1.2;
form1.caption:=floattostr(d1*d2-13.2); //本该为0,可是却只是无限接近于0的数值....这里 不存在复杂的循环,为何不能计算正确呢? 你看能delphi显示正确结果吗 ?
我没怎么用delphi,可是想试验一下,就发现这样,我是否该去领奖呢?:) http://kj88.com
begin
d1:=11;d2:=1.2;
form1.caption:=floattostr(d1*d2-13.2); //本该为0,可是却只是无限接近于0的数值....这里 不存在复杂的循环,为何不能计算正确呢? 你看能delphi显示正确结果吗 ?
我没怎么用delphi,可是想试验一下,就发现这样,我是否该去领奖呢?:) http://kj88.com
var d1,d2:Extended;
begin
d1:=11;d2:=1.2;
form1.caption:=floattostr(d1*d2-13.2); //本该为0,可是却只是无限接近于0的数值....这里 不存在复但是....但是...无论你用c也好,c++也好,java,c# 还有xXXXX语言,都有精度问题,与delphi无关.不要有的放矢哈
var d1,d2,d3:Currency;
begin
d1:=11;
d2:=1.2;
edit1.Text :=currtostr(d1*d2);
d3 :=d1*d2;
edit2.Text :=CurrToStr(d3-13.2);end;
不是语言的问题
CPU就是这样的~
大数字,有多大?整数还是浮点数?
要是进行某些类似RSA的整数运算,你最好自己定义一个类。
大数字,有多大?整数还是浮点数?
要是进行某些类似RSA的整数运算,你最好自己定义一个类。
其中的数字都使用字符来表示。
如果你不希望出现这样的问题,可以使用Currency类型,如果Currency类型表示的范围你还不满意的话,DELPHI支持BCD,你可以用BCD数据类型,应该够你用了吧。
记住一点,所有浮点数都是近似值;这个和内部处理有关;
你要的是百分之百的精确,而浮点数只能做到99%的精确。如果你不注意,万一那次让你碰到1%的不精确,你不就惨了;至于这样的判断怎么处理;楼上hxfjb(New人)已经说了一些.你还可以用if A-B < 0.001 then 这样的形式判断.
我们在教科书上经常看到,想判断两个浮点数是否相等,往往不能直接用 == 判断。这是因为浮点数的运算经常有误差,导致结果有细小的误差,在判断相等时需要忽略这些误差。比如判断 a==b 经常被写作 fabs(a-b)<0.00001 这样的形式。 其实,这里可以用更高效率的方式,即直接降低精度,只需要做一个 & 操作就可以了。 比如想对 double f 降低精度,只需要做 *((__int64*)&f)&=~0xf; 0xf 是可调整的,这一句就是把底数最后几位清为 0 而已。 x86 用的浮点数是 IEEE 754 标准. 一个 double 有 64 bit. 最高一个 bit 是符号位. (浮点数的正负不是用补码表示的) 低 52 [0,51] bits 是底数, 所有的浮点数都是 1.xxxxxx * 2^n 表示的. 这个 xxxxx 就是底数.1 是省略不写的. [52,62] 表示的这个 n, 也就是指数. 这个 n 有 11 bits, 是用移码表示的. 为什么用移码? 因为最终想用 8 字节的 0 表示浮点数的 0. 而且可以直接用整数的大小比较, 比较浮点数. 11 bits 的 0 表示的是负无穷, 0 其实是用 1*2^(-无穷大) 表示出来的。
"delphi数值计算的重大隐患bug"这个桂冠可能就要属于你了*_*
var d1,d2:real;
begin
d1:=11;d2:=1.2;
form1.caption:=floattostr(d1*d2-13.2); //显示不符合要求但是
var d1,d2:real;
begin
d1:=11;d2:=1.1;
form1.caption:=floattostr(d1*d2-13.2); //显示符合要求注意:d1*d2=13.2的时候才出错,其他正常!!!!!!!!
让大家解释的就是为什么相等时候就不正常了呢???????其他均正常!!!!!并非什么情况都不能比较!
这个原因就不用我说了吧:)