Math 将科学记数法中的字符串格式化为十进制字符串
我有一个像“2.1648797E-05”这样的字符串,我需要将其格式化为转换为“0.0002164877”Math 将科学记数法中的字符串格式化为十进制字符串,math,io,c++-cli,Math,Io,C++ Cli,我有一个像“2.1648797E-05”这样的字符串,我需要将其格式化为转换为“0.0002164877” 在C++中,是否有进行此转换的解决方案?您可以使用std::stringstream首先打印数字,然后将其读取为双精度,然后使用格式说明符将数字的精度设置为12位。查看有关如何以固定精度打印十进制数的问题。尝试使用double或long cout << setiosflags(ios::fixed) << thefloat << endl; cout如
在
C++
中,是否有进行此转换的解决方案?您可以使用std::stringstream
首先打印数字,然后将其读取为双精度,然后使用格式说明符将数字的精度设置为12位。查看有关如何以固定精度打印十进制数的问题。尝试使用double
或long
cout << setiosflags(ios::fixed) << thefloat << endl;
cout如果您真的只是从字符串表示转换为字符串表示,并且精度非常重要,或者值可能会离开双精度的有效范围,那么我将避免转换为双精度。
由于精度错误或范围问题,您的值可能会因此而改变
尝试编写一个简单的文本解析器。大致如此:
读取数字,省略小数点至“E”,但存储小数点位置。
在“E”之后,读取指数作为数字,并将其添加到存储的十进制位置。
然后再次正确地输出数字,在开头或结尾添加零并插入小数点。谢谢各位,我使用以下方法修复它:
Decimal dec = Decimal.Parse(str, System.Globalization.NumberStyles.Any);
这里有一些不明确的问题
1.“2.1648797E-05”中的空格是否有意,让我们假设它是正确的。
2.2.1648797E-05比0.0002164877小10倍。假设OP表示“0.000021648797”(另一个零)。
3.Windows未被标记,但OP发布了Windows答案
这里的主要挑战,我认为是OP的核心问题是std::precision()
在fixed
和default
中有不同的含义,OP想要fixed
中的default
含义
“精度”字段在“固定”和“默认浮点表示法”之间有所不同。默认情况下,“精度”字段指定小数点前后显示的可用位数的最大值(可能使用科学记数法),而在“固定”中,“精度”字段指定小数点后显示的位数
解决此问题的两种方法:将输入字符串更改为数字,然后以新的固定空间格式输出数字-如下所示。第二种方法是解析输入字符串并形成新的格式-这里不做
#include <iostream>
#include <iomanip>
#include <string>
#include <sstream>
#include <cmath>
#include <cfloat>
double ConvertStringWithSpaceToDouble(std::string s) {
// Get rid of pesky space in "2.1648797E -05"
s.erase (std::remove (s.begin(), s.end(), ' '), s.end());
std::istringstream i(s);
double x;
if (!(i >> x)) {
x = 0; // handle error;
}
std::cout << x << std::endl;
return x;
}
std::string ConvertDoubleToString(double x) {
std::ostringstream s;
double fraction = fabs(modf(x, &x));
s.precision(0);
s.setf(std::ios::fixed);
// stream whole number part
s << x << '.';
// Threshold becomes non-zero once a non-zero digit found.
// Its level increases with each additional digit streamed to prevent excess trailing zeros.
double threshold = 0.0;
while (fraction > threshold) {
double digit;
fraction = modf(fraction*10, &digit);
s << digit;
if (threshold) {
threshold *= 10.0;
}
else if (digit > 0) {
// Use DBL_DIG to define number of interesting digits
threshold = pow(10, -DBL_DIG);
}
}
return s.str();
}
int main(int argc, char* argv[]){
std::string s("2.1648797E -05");
double x = ConvertStringWithSpaceToDouble(s);
s = ConvertDoubleToString(x);
std::cout << s << std::endl;
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
双ConvertStringWithSpaceToDouble(标准::字符串s){
//摆脱“2.1648797E-05”中令人讨厌的空格
s、 擦除(std::remove(s.begin()、s.end()、“”)、s.end());
std::istringstream i(s);
双x;
如果(!(i>>x)){
x=0;//句柄错误;
}
std::您是否应该显示您迄今为止尝试过的代码,并具体说明它不起作用的原因(例如,编译器错误、输出格式错误等)。这样我们可以看到,例如,您打算使用,iostreams
进行输出。您尝试过吗?@没有建议他(?)是Windows上的,所以我认为我们应该坚持标准库,除非告诉其他。你喜欢C++中的一个解决方案吗?用十进制。