TO SS2000(SS2000): if (abs(a-0.4) < 0.000000001) 我试到了小数点后面第13位还是为false;<0.1也是false,它是不是无穷小啊?
不管为何,总有一种方法能够让浮点数与浮点数之间进行比较吧,比如一种很愚蠢的方法 var a,b:real; begin a:=0.4; b:=0.4; if b<=a then ...... end; 这种方法可以,但如果0.4是做常数用的啊,如果我的常数多了,有很多比较的区间,这种方法就不可取了,有哪位大侠能出高招啊?
a: extended另外我试了C++Builder,有同样问题
必须
double a=0.4 ;
if (a <= 0.4)
或者
float a=0.4;
if(a <= (float)0.4)
才行C#也这样
float a=0.4F;
if(a<=0.4)
也不行
作为浮点数的比较方法,均是采用差值比较法,比如,判断一个浮点数是否和0.4相等,因改采用 if (abs(a-0.4) < 0.000000001)这是浮点数比较的基本常识。浮点数在计算机的表达方式大家可以去查一下计算机组成原理等一些数,或在网上查找一下,我就不多说了
浮点数好象都是精确到小数点后面某个位的
其实Extended类型也有这种问题,它也是REAL类型。
但不明白为什么你要精确到小数点后0.000000001才算是相等,为什么长一点或短一点就不行呢?
把两个变量都赋值为0.4时就可以,即使是一个定义为real型,一个定义为Currency也可以的
Real 类型在Delphi 2 和 Delphi 3 中的定义与 16 位版本一样,都占 6 个字节。不过Borland公司一直不提倡使用这种类型,而建议用Single、 Double、 Extended 类型代替。这是由于 Real 这种 6 字节的旧格式既不受 Intel CPU 的支持,又没有列在官方的IEEE 实型中。为了完全解决这一问题,Delphi 4 不得不修改 Real 类型的定义,将其改成标准的 8 字节浮点型, 由此引起了兼容性问题,不过如果有必要,你可以采用下面编译指令克服兼容性问题,恢复Delphi 2 和 Delphi 3 的Real 类型定义:{$REALCOMPATIBILITY ON}对实型数据,我们没办法编一个类似Range的程序,因为High 、Low及 Ord函数不能用于实型值。理论上说实型类型代表一个无限的数字集合;有序类型代表一个有限的数字集合。注意:让我进一步把上述问题解释一下。对于整数 23,你能确定23 后面的数是什么 ,因为整型数是有限的,它们有确定的值域范围及排列顺序。而浮点数即使在一个很小的值域范围内也无限、无序。 事实上,在 23 和 24 之间有多少值? 哪个值是 23.46 后面的值? 23.47 还是 23.461,或者 23.4601? 这是很难说清的。
if (abs(a-0.4) < 0.000000001)
我试到了小数点后面第13位还是为false;<0.1也是false,它是不是无穷小啊?
var
a,b:real;
begin
a:=0.4;
b:=0.4;
if b<=a then
......
end;
这种方法可以,但如果0.4是做常数用的啊,如果我的常数多了,有很多比较的区间,这种方法就不可取了,有哪位大侠能出高招啊?