C语言, 自己实现了一个double转char*的函数, 可是会自动四舍五入怎么办?

yyxgs 2018-05-26 03:33:59
/**
* double 转 char*
* @param number double变量
* @return 返回 char*
*/
char* doubleToStr(double number) {
int num = (int)number; // 取整数部分

// 如果是整数, 调用 numberToStr方法转换为char*
if (num == number) {
return numberToStr(num);
}

double tempNumber = number;
char* tempStr = dos(7);

if (number < 0) {
tempNumber = 0 - tempNumber;
}
tempNumber *= 10;

int i = 0;
int tempNum = 0;
int addNumber = 0;
int index = 7;

for (i = 0;i < 6;++i) {
tempNum = (int)tempNumber;
addNumber = tempNum % 10;

*(tempStr + i) = addNumber + '0';

// 如果这位小数不是0, 那么就将字符串的下一位设置为结束符
if (addNumber != 0) {
index = i + 1;
}

tempNumber *= 10;
}
*(tempStr + index) = '\0';

char* str = dos(50);
strcpy(str, "\0");

if (number > -1 && number < 0) {
strcpy(str, "-");
}
strcat(str, numberToStr(number));
strcat(str, ".");
strcat(str, tempStr);
strcat(str, "\0");

// 释放 tempStr
if (tempStr != NULL) {
free(tempStr);
tempStr = NULL;
}

return str;
}



...全文
811 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xian_wwq 2018-05-27
  • 打赏
  • 举报
回复
引用 6 楼 yyxgs 的回复:
[quote=引用 4 楼 paschen 的回复:] printf在输出浮点数默认位数就那么多,你可以控制你要的位数 printf("%f\n", 1.123456789); //按默认 printf("%.*f\n", 8, 1.123456789); //8位
如果我输入了1.999999999999999,结果就是2[/quote] 这个和精度有关 float类型的数据有效位数是6位或者7位
真相重于对错 2018-05-27
  • 打赏
  • 举报
回复
引用 12 楼 yyxgs 的回复:
[quote=引用 11 楼 hdt 的回复:] 要实现这样的功能,最好把浮点数在计算机中怎么表示弄清楚最好
请问这方面的知识哪门课程里面的?是计算机组成原理吗?[/quote] https://baike.baidu.com/item/%E6%B5%AE%E7%82%B9%E6%95%B0/6162520?fr=aladdin
yyxgs 2018-05-27
  • 打赏
  • 举报
回复
引用 11 楼 hdt 的回复:
要实现这样的功能,最好把浮点数在计算机中怎么表示弄清楚最好
请问这方面的知识哪门课程里面的?是计算机组成原理吗?
真相重于对错 2018-05-27
  • 打赏
  • 举报
回复
要实现这样的功能,最好把浮点数在计算机中怎么表示弄清楚最好
yyxgs 2018-05-27
  • 打赏
  • 举报
回复
引用 8 楼 paschen 的回复:
[quote=引用 6 楼 yyxgs的回复:][quote=引用 4 楼 paschen 的回复:] printf在输出浮点数默认位数就那么多,你可以控制你要的位数 printf("%f\n", 1.123456789); //按默认 printf("%.*f\n", 8, 1.123456789); //8位
如果我输入了1.999999999999999,结果就是2[/quote] printf("%.*f\n", 15, 1.999999999999999);[/quote] 谢谢!
yyxgs 2018-05-27
  • 打赏
  • 举报
回复
引用 7 楼 xian_wwq 的回复:
[quote=引用 6 楼 yyxgs 的回复:] [quote=引用 4 楼 paschen 的回复:] printf在输出浮点数默认位数就那么多,你可以控制你要的位数 printf("%f\n", 1.123456789); //按默认 printf("%.*f\n", 8, 1.123456789); //8位
如果我输入了1.999999999999999,结果就是2[/quote] 这个和精度有关 float类型的数据有效位数是6位或者7位[/quote] 是double
paschen 2018-05-27
  • 打赏
  • 举报
回复
引用 6 楼 yyxgs的回复:
[quote=引用 4 楼 paschen 的回复:] printf在输出浮点数默认位数就那么多,你可以控制你要的位数 printf("%f\n", 1.123456789); //按默认 printf("%.*f\n", 8, 1.123456789); //8位
如果我输入了1.999999999999999,结果就是2[/quote] printf("%.*f\n", 15, 1.999999999999999);
yyxgs 2018-05-26
  • 打赏
  • 举报
回复
引用 4 楼 paschen 的回复:
printf在输出浮点数默认位数就那么多,你可以控制你要的位数 printf("%f\n", 1.123456789); //按默认 printf("%.*f\n", 8, 1.123456789); //8位
如果我输入了1.999999999999999,结果就是2
paschen 2018-05-26
  • 打赏
  • 举报
回复
printf在输出浮点数默认位数就那么多,你可以控制你要的位数 printf("%f\n", 1.123456789); //按默认 printf("%.*f\n", 8, 1.123456789); //8位
yyxgs 2018-05-26
  • 打赏
  • 举报
回复
引用 2 楼 ckc 的回复:
做这样的函数干啥?比sprintf强在哪?
练练手而已
ckc 2018-05-26
  • 打赏
  • 举报
回复
做这样的函数干啥?比sprintf强在哪?
yyxgs 2018-05-26
  • 打赏
  • 举报
回复

char* numberToStr(int number) {
	char* tempStr = dos(20); // 分配20个内存

	if (number == 0) {
		*(tempStr + 0) = '0';
		*(tempStr + 1) = '\0';

		return tempStr;
	}

	// 判断是否为负数
	bool negativeNumber = false;
	if (number < 0) {
		number = abs(number);
		negativeNumber = true;
	}

	int i = 0;
	for (;number != 0;++i) {
		*(tempStr + i) = number % 10 + '0';
		number /= 10;
	}

	// 如果是负数, 加上 '-' 号
	if (negativeNumber == true) {
		*(tempStr + i) = '-';
		++i;
	}
	*(tempStr + i) = '\0';

	// 逆序字符串
	char* str = reverseStr(tempStr);

	// 释放tempStr
	if (tempStr != NULL) {
		free(tempStr);
		tempStr = NULL;
	}

	return str;
}

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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