10进制纯小数转2进制小数。

今天,毛线同学写作业的时候,突然冒出个想法:写个十进制小数转二进制小数的程序如何?  我一想,中!。刚好写作业的时候,需要用到。

于是,立即回寝室。写起。完成的还是挺快的.

10进制纯小数转2进制小数的方法,很简单。就是对小数部分,乘二。之后,对整数位取整。整数位为0就是零,为1就是1,然后整数位归零。重复这个过程。

直到,得出的结果为0。


/*
 *	名称:限制版进制转换
 *
 *	概述 :十进制小数转换二进制,不可直接用分数作为输入。
 *
 *  作者:CSB
 *
 *	日期:13/5/1
 *
 */
#include <iostream>
using namespace std;

//
// 常量
//
const int precision = 100;						//精确到几位,即算出来的小数的最大位数
const double ratio = 0.000000001;					//精度,当一个浮点数与ratio的差小于ratio时,则算作0


//
// 函数定义
//
/***************************************************************
*
*	判断输入的小数,是否小于精度值
*	小于则判断为0,返回真
*
*/
bool is_zero( const double &in )
{
	if( in - ratio < ratio )
	{
		return true;
	}
	else
	{
		return false;
	}
}

/***************************************************************
*
*	功能:10进制转换为2进制
*
*	概述:每步对十进制小数乘二取整,然后继续对剩下的小数部分,乘二取整
*	直到小数部分变为零
*	
*	输入数的类型,要求为纯小数。
*
*/
void Dec_To_Bin(double &in)
{
	int time = 0,sign_bit = 0;

	//当输入的数为负数时,取这个数的绝对值,同时sign_bit置1(表示符号位)。
	if( in > 1)
	{
		cout<<"整数部分不为0,暂时不支持这种转换"<<endl;
		return;
	}
	else
	if( in < 0 )
	{
		in = abs(in);
		sign_bit = 1;
	}

	//输出符号位和小数点
	cout<<sign_bit<<'.';

	//输入数为0,则直接输出0
	if( is_zero(in) )
	{
		cout<<0<<endl;
		return;
	}

	//进行运算,乘二后的得数,若大于1,则证明整数部分为1,输出1.
	//同理小于1输出0,当得数等于1时,转换完成。
	while( time <= precision )
	{
		in *= 2;

		if( in > 1 )
		{
			in -= 1;
			cout<<1;
		}
		else
		if( in == 1 )
		{
			cout<<1<<endl;
			break;
		}
		else
		if( in < 1 && in > 0)
		{
			cout<<0;
		}

		time++;
	}

}

/***************************************************************
*
*	功能:输入十进制小数,转换为二进制小数,支持多次输入	
*	
*	注意:当一个小数后面跟着字符的时候,会只计算那个小数。同时,后面的字符
*	会被清除
*
*/
void input_Dec_Output_Bin()
{
	double in =  0.;
	char q = ' ';
	
	while( q != 'q' )
	{
		cout<<"请输入需要转换的小数: ";
		cin>>in;
		
		//清空输入缓冲区,防止错误输入
		cin.clear();
		cin.ignore(numeric_limits<streamsize>::max(),'\n');

		Dec_To_Bin(in);
		cout<<"退出请按q,继续请输入其他字符"<<endl;
		cin>>q;

		//清空输入缓冲区,防止错误输入
		cin.clear();
		cin.ignore(numeric_limits<streamsize>::max(),'\n');
	}
}

int main(void)
{
	system("color 0e");

	input();
	
	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值