/**
* 程序功能:高精度截取double型数据的小数部分
* 作者:lzh1097776020
* 完成时间:2019.4.11
* 备注:暂仅支持十进制正的浮点数,15位有效数字,无扩展性
* 代码难免有不足之处,若有疑问可联系1097776020@qq.com
*/
//函数体原型
double double_trunction_from_Double_partDec(double num)
{
//必要函数声明
char *string_parse_from_Double_partDec_p(double num);
double string_parse_to_Double(char s[]);
char *figure_p = string_parse_from_Double_partDec_p(num);
double num_p = string_parse_to_Double(figure_p);
return num_p;
}
//代码体:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define DOUBLE_PRECISION_BITS 15 // double型数据的有效位数
#define BASE 10 // 本函数只支持十进制数据,底数为10
/*输入十进制浮点数,返回字符串字面量*/
char *string_parse_from_Double(double num)
{
unsigned long long m = (unsigned long long)num;
char *si = (char*)malloc((DOUBLE_PRECISION_BITS + 2) * sizeof(char)); //+2是因为一位留给'.',一位留给'\0'。
char sp[DOUBLE_PRECISION_BITS + 2];
int i, j;
for (i = 0; m != 0; i++) {
si[i] = m % 10 + '0';
m = m / 10;
}
si[i] = '\0';
for (j = 0; j < DOUBLE_PRECISION_BITS - strlen(si); j++) {
num = num * 10;
sp[j] = (unsigned long long)num % 10 + '0';
}
sp[j] = '\0';
int l = strlen(sp);
char temp;
l = strlen(si);
for (i = 0; i < l / 2; i++) {
temp = si[i];
si[i] = si[l - i - 1];
si[l - i - 1] = temp;
}
si[l] = '.';
si[l + 1] = '\0';
strcat_s(si, DOUBLE_PRECISION_BITS + 2, sp);
return si;
}