十进制 1.25 转为二进制......

FCPPMM2 2003-09-29 10:33:42
Var
D1:Double;

Begin

D1:='1.25';
Edit1.Text:= D1的二进制表示? 0000 0001 . 0100 0000

D1:='1.50';
Edit1.Text:= D1的二进制表示? 0000 0001 . 1000 0000

D1:='1.99';
Edit1.Text:= D1的二进制表示? 0000 0001 . 1111 1111

End;

格式如上,十进制小数部分转二进制没有函数,循环×2取整数就可以得到的,大家帮我写个函数吧。只要帮我写小数部分的就行了。谢谢你们。
...全文
988 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
planfore 2003-09-29
  • 打赏
  • 举报
回复
整数部分除2,取余,小数好象是乘2,取整,就和用笔算时一样,应该不是很复杂吧!
jacky_shen 2003-09-29
  • 打赏
  • 举报
回复
刚才的代码有问题。
jacky_shen 2003-09-29
  • 打赏
  • 举报
回复
//------------------------------------------------------------------------------
//函数名称: Dec2Bin
//返回类型: string
//用法: S 输入要转换的内容 B是显示否转换后的小数部分
//作者: jacky_shen
//日期: 2003-09-29 12:03
//备注: 如有问题,还请指正,谢谢
//------------------------------------------------------------------------------
function Dec2Bin(const S: string; B: Boolean = True): string;
var
DoubleNumber: Double;
IntegerNumber: Integer;
function Convert(Num: Integer): string;
var
N1, N2: Integer;
begin
N1 := Trunc(Num);
N2 := N1 mod 2;
N1 := N1 div 2;
Result := IntToStr(N2);
while N1 <> 0 do
begin
N2 := N1 mod 2;
N1 := N1 div 2;
Result := IntToStr(N2) + Result;
end;
end;
begin
//异常处理
try
DoubleNumber := StrToFloat(S);
except
raise;
end;
//转换整数部分
IntegerNumber := Trunc(DoubleNumber);
Result := Convert(IntegerNumber);
//转换小数部分
if B then
begin
IntegerNumber := Trunc(DoubleNumber * (Length(FloatToStr(Frac(DoubleNumber))) - 2));
Result := Result + '.' + Convert(IntegerNumber);
end;
end;


procedure TForm1.Button4Click(Sender: TObject);
begin
Caption := Dec2Bin('1252222.31111145');
end;
2312 2003-09-29
  • 打赏
  • 举报
回复
我测试通过了,小数我找时间再给你写一个,你再试试:
var
Form1: TForm1;
Ten2Two:string;
implementation

{$R *.dfm}

function dectobin(i:integer):string;
var
j:integer;
s:string;
begin
j:=i;s:=' ';
while j>=2 do
begin
if (j mod 2)=1 then
begin
s:='1'+s;
j:=j div 2;
end
else
begin
s:='0'+s;
j:=j div 2;
end;
end;
s:=chr(ord('0')+j) + s;
Ten2Two:=s;
end;
function Two2Ten(k:string):integer;
var
i,j,t:integer;
s:char;
begin
t:=1;
j:=length(k);j:=0+(ord(k[j])-ord('0'))*t;;
for i:=length(k)-1 downto 1 do
begin
s:=k[i];t:=t*2;
j:=j + ((ord(s)-ord('0'))*t);
end;
Two2Ten:=j;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
dectobin(strtoint(trim(edit1.Text)));
Edit2.Text:=Ten2Two;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Edit2.Text:=inttostr(Two2Ten(trim(edit2.Text)));
end;

end.
ronaldli 2003-09-29
  • 打赏
  • 举报
回复
写完了,适用带小数有理数的转换,适用负数

// 10进制整数 转 2进制整数
function IntToBin(aInt: Int64): String;
var
vFlag: Boolean;
vBit: Shortint;
begin
vFlag := aInt < 0;

repeat
vBit := aInt mod 2;
aInt := aInt div 2;
Result := IntToStr(Abs(vBit)) + Result;
until aInt = 0;

if vFlag then
Result := '-' + Result;
end;

// 10进制纯小数 转 2进制小数
function DecimalToBin(aDec: Double): String;
var
vDoubleIt: Double;
begin
aDec := Frac(Abs(aDec));
if aDec <> 0 then
begin
vDoubleIt := aDec * 2;
Result := IntToStr(Trunc(vDoubleIt)) + DecimalToBin(vDoubleIt);
end;
end;

// 10进制有理数 转 2进制有理数
function FloatToBin(aFloat: Double): String;
var
vInteger: Int64;
vDecimal: Double;
begin
vInteger := Trunc(aFloat);
vDecimal := Frac(aFloat);
Result := IntToBin(vInteger) + '.' + DecimalToBin(vDecimal);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
try
Edit2.Text := FloatToBin(StrToFloat(Edit1.Text));
except
MessageBox(Handle, '请输入合法有理数', '错误', MB_OK);
end;
end;
tjff2000 2003-09-29
  • 打赏
  • 举报
回复
procedure TForm1.Button2Click(Sender: TObject);
label l;
var a:single; str:string[8];
begin
str:='';
a:=strtofloat(Edit3.Text);
l: while 2*a<1 do
begin
a:=2*a;
str:=str+'0';
end;
while 2*a>=1 do
begin
str:=str+'1';
a:=2*a-1;
end;
if a<>0 then
goto l;
showmessage(str);
end;
2312 2003-09-29
  • 打赏
  • 举报
回复
http://members.lycos.co.uk/zhanshan2002/cpro/TNS.html
FCPPMM2 2003-09-29
  • 打赏
  • 举报
回复
2312(007) 不对不对,你自己也不试试就拿上来乱贴。



大家要看清楚题目阿
2312 2003-09-29
  • 打赏
  • 举报
回复
十进制转换为二进制
function DecToBinStr(n: integer): string;
var
S: string;
i: integer;
Negative: boolean;
begin
if n < 0 then
Negative := true
else
Negative := False;

n := Abs(n);
for i := 1 to SizeOf(n) * 8 do
begin
if n < 0 then
S := S + '1'
else
S := S + '0';

n := n shl 1;
end;
Delete(S,1,Pos('1',S) - 1);//remove leading zeros
if Negative then
S := '-' + S;
Result := S;
end;
FCPPMM2 2003-09-29
  • 打赏
  • 举报
回复
早上能写出来吗?
FCPPMM2 2003-09-29
  • 打赏
  • 举报
回复
我等你们。
ronaldli 2003-09-29
  • 打赏
  • 举报
回复
我给你写一个完整的,整数小数都转换
tjff2000 2003-09-29
  • 打赏
  • 举报
回复
不好意思,理解错了
FCPPMM2 2003-09-29
  • 打赏
  • 举报
回复
这样吧,你把0.25转为 0100 0000 就行了。怎么样?行不行?
tjff2000 2003-09-29
  • 打赏
  • 举报
回复
Function inttobin(m:integer):string;
var
rest:integer;
str:string[5];
begin
str:='';
while m<>0 do
begin
if m=1 then
begin
str:='1'+str;
m:=0;
end
else
begin
rest:=m mod 2;
str:=inttostr(rest)+str;
m:=(m-rest) div 2;
end;
end;
if m=0 then
result:=str;
while length(result)<4 do
begin
result:='0'+result;
end;

end;
FCPPMM2 2003-09-29
  • 打赏
  • 举报
回复
用整数转二进制?你搞错了。转出来结果错的。

不简单的,你写一下就知道不容易,你要写得出来就把分给你。
tjff2000 2003-09-29
  • 打赏
  • 举报
回复
其实还不是可以用整数转二进制的么?
可以先用Ansipos('.',D);获取小数点位置,然后按位取出字符,转换为二进制即可,很简单。
tjff2000 2003-09-29
  • 打赏
  • 举报
回复
其实还不是可以用整数转二进制的么?
可以先用Ansipos('.',D);获取小数点位置,然后按位取出字符,转换为二进制即可,很简单。
FCPPMM2 2003-09-29
  • 打赏
  • 举报
回复
8位二进制转为十进制.............. 我只有20分了,不好意思:

http://expert.csdn.net/Expert/topic/2314/2314538.xml?temp=.83659
FCPPMM2 2003-09-29
  • 打赏
  • 举报
回复
ronaldli(木的) 的 结构清晰,递归实现,代码少,取用。
加载更多回复(3)

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧