关于to_string实现double 的原理
  • 板块学术版
  • 楼主_8008008
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/12/1 12:38
  • 上次更新2023/12/1 17:45:13
查看原帖
关于to_string实现double 的原理
803885
_8008008楼主2023/12/1 12:38

rt,我的想法是将小数和整数分离,然后小数不断*10,取整数位直到0,整数不断取%10的结果,即个位,取完结果再/10,最后将整数倒序+'.'+小数正序就行了,但是会产生精度误差,求解决方案。

#include<iostream>
#include<cstring>
#include<vector>
#include<stdio.h>
using namespace std;
string TO_STRING(double v){
	int big=v;
	double small=v-big;
	char copb[30],cops[30];//copybig,copysmall复制 
	int lencopb=0,lencops=0;//len长度 
	while(big!=0){
		copb[lencopb]=48+big%10;
		big/=10;
		lencopb++;
	}
	while(small!=(0.0)){
		small*=10;
		copb[lencops]=48+(int)small;
		lencops++;
		small-=(int)small;
		cout<<small<<'\n';//输出发现精度损失 
	} 
	string ans;
	for(int i=lencopb-1;i>=0;i--)ans.push_back(copb[i]);
	if(v!=(int)v){
		ans.push_back('.');
		for(int i=0;i<lencops;i++)ans.push_back(cops[i]);
	}
	return ans;
}
int main(){
	double a=114514.191981;
	cout<<TO_STRING(a);
	return 0;
}
2023/12/1 12:38
加载中...