转载自柳婼的个人博客 我添上了解释
// ConsoleApplication2.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
int main() {
freopen("Text1.txt", "r", stdin);
string s;
cin >> s;
int i = 0;
while (s[i] != 'E') i++;
string t = s.substr(1, i - 1);
int n = stoi(s.substr(i + 1));
if (s[0] == '-') cout << "-";//数字的正负由第一个字符决定,是负数就输出负号,不是就不输出。
if (n < 0) {// 指数小于零则左移小数点,因此一定会先出现 0. 先把0.输出,然后根据左移动的数位确定小数点后的零的数目。
cout << "0.";
for (int j = 0; j < abs(n) - 1; j++) cout << '0';//输出小数点后零的数目
for (int j = 0; j < t.length(); j++)//输出有效数字。
if (t[j] != '.') cout << t[j];
}
else {/*当指数大于零 即小数点需右移时,需要判断右移的长度即变量n是否长于有效数字的长度,
如果比有效数字长,需要补上零。*/
cout << t[0];//如果指数不小于零,那么小数点一定在第一个数字之后,所以先输出第一个数字。
int cnt, j;
for (j = 2, cnt = 0; j < t.length() && cnt < n; j++, cnt++) cout << t[j]; /*cnt 是已经输出的右移的数位,如果它不比n小说明右移
已经结束。或者cnt仍然比n小,但是因为j不小于t.length而结束了循环,说明需要在后面补零。
后面的if else 就是为了判断到底是哪一种情况结束了循环
*/
if (j == t.length()) {
for (int k = 0; k < n - cnt; k++) cout << '0';
}
else {
cout << '.';//如果j比t.length小,则右移的长度小于有效数字的长度,此时输出小数点,并将有效数字中剩下的部分输出。
for (int k = j; k < t.length(); k++) cout << t[k];
}
}
return 0;
}