来自:【数据结构与算法分析——C语言描述】练习1.3
思路:取得一个数的整数部分和小数部分。整数部分直接用类型强制转换,然后用数减去整数部分得到小数部分。
1. 打印整数部分;
void printOut(int n) { if (abs(n) >= 10) { printOut(n / 10); printDigit(abs(n % 10)); } else printDigit(n); }
至于printDigit(),感觉有点鸡肋。为了迎合题目,加上了。
void printDigit(int n) { printf("%d", n % 10); }
2.如果小数部分不为0,则将小数点后六位转换成整数部分,将之打印。结束。
for (int i = 0; i < 6; i++) //小数点后六位转化为整数 decPart *= 10; intPart = abs((int)decPart); printOut(intPart); //打印转化后的小数部分
实现:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <math.h> void printDigit(int n); void printOut(int n); int main(void) { double n, decPart; //数和小数部分 int intPart; //整数部分 n = -214748.3647; intPart = (int)n; decPart = n - (double)intPart; printOut(intPart); if (decPart) { printf("."); for (int i = 0; i < 6; i++) //小数点后六位转化为整数 decPart *= 10; intPart = abs((int)decPart); printOut(intPart); //打印转化后的小数部分 } system("pause"); return 0; } /*打印整数*/ void printOut(int n) { if (abs(n) >= 10) { printOut(n / 10); printDigit(abs(n % 10)); } else printDigit(n); } /*打印1位*/ void printDigit(int n) { printf("%d", n % 10); }
为什么只打印小数点后6位,而不是全部 —— 万一输入的数有8位小数呢?我们知道,大部分浮点数保存在计算机中都只是一个近似值,对小数部分有截短或进位。比如输入123.123123,内部可能存为123.12312300000001。所以这里只取前6位的。如果使用精确数值类型,就可以有效地避免这种精度丢失的问题。
如果您有更好的算法,欢迎交流。与前辈和爱好者学习是我的荣幸。谢谢!
参考链接:http://blog.csdn.net/fuzhengchao/article/details/7634589