简单运算都不行?x:=2984297*439833 ( 积分: 100 )

  • 主题发起人 主题发起人 东问西答
  • 开始时间 开始时间

东问西答

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.Button1Click(Sender: TObject);
var x:double;
begin
x:=2984297*439833;
end;
[Error] Unit1.pas(29): Overflow in conversion or arithmetic operation
怎么会呢?这么小的数也会溢出?
 
procedure TForm1.Button1Click(Sender: TObject);
var x:double;
begin
x:=2984297*439833;
end;
[Error] Unit1.pas(29): Overflow in conversion or arithmetic operation
怎么会呢?这么小的数也会溢出?
 
虽然可以这样解决,但是不知其所以然,请大家多多赐教.
procedure TForm1.Button1Click(Sender: TObject);
var a,b,x:double;
begin
a:=2984297;
b:=439833;
x:=a*b;
end;
 
估计:
2984297*439833
两个都是整数,计算机默认这两个数为integer,默认结果也是整数。
但由于x:double;
在正常情况下,在相乘后进行强制类型转换。
由于2984297*439833的结果大于integer所以溢出了。
 
以前好像有相关的讨论,主要是Delphi想把2984297编译成整型,所以通不过
这样就行
var x:double;
begin
x:=2984297.0*439833;
end;
 
你知道怎么解决,真相也就不远了:
过程是这样的:
Delphi把2984297和439833作为一个integer,
然后计算2984297*439833,然后再把结果转换为Double。
然而在中间出错了,Delphi认为,Integer*Integer的结果仍然是integer,而 2984297*439833超出了integer的范围,这就是你为什么看到错误的原因。
解决的方法除了上面的方法,还可以这样:
X := 2984297.0 * 439833;
在运算的值后面加一个.0,编译器就会认为这是一个浮点数,结果自然也就正确了。
或者分2步:
X := 2984297;
X := X*439833;
原理都一样,就是让编译器把其中至少一个数认为是浮点数,就正确了。
 
2984297*439833
编译器先相乘后进行强制类型转换
显然上述相乘时已经溢出
 
认为abookdog说的对。虽然是double,但是有一半单元是用来存储小数的,所以溢出
 
2984297*439833两个整数相乘,结果还是整数,但是这个已经超出最大的整型Int64的上界了。改用浮点数乘法即可
 
同意DoubleWood的观点。
 
谢谢大家.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
723
import
I
I
回复
0
查看
652
import
I
后退
顶部