我有一个像“2.1648797E -05”这样的字符串,我需要对其进行格式化以转换“0.00021648797”
有什么解决方案可以进行这种转换
尝试使用double
或long long
cout << setiosflags(ios::fixed) << thefloat << endl;
浮点的一个重要特征是它们没有与所有有效数字相关联的精度,返回到大值的小数点。“科学”的展示合理地反映了内在的存储现实。
在C++
您可以使用std::stringstream
首先打印数字,然后将其读取为双精度,然后使用格式说明符将其打印以将数字的准确性设置为 12 位。看看这个问题,了解如何以固定精度打印十进制数。
如果您真的只是从字符串表示到字符串表示并且精度非常重要,或者值可能会离开双精度的有效范围,那么我会避免转换为双精度。由于精度错误或范围问题,您的值可能会因此而改变。
尝试编写一个简单的文本解析器。大概是这样:读取数字,省略小数点到“E”,但存储小数点位置。在“E”之后,将指数读取为数字并将其添加到您存储的小数位。然后再次输出数字,在开头或结尾正确附加零并插入小数点。
谢谢大家,我使用以下方法修复它:
Decimal dec = Decimal.Parse(str, System.Globalization.NumberStyles.Any);
这里有不清楚的问题
1.“2.1648797E -05”中的空格是故意的,我们假设它是可以的。
2. 2.1648797E-05 比 0.00021648797 小 10 倍。假设 OP 的意思是“0.000021648797”(另一个零)。
3. Windows 未标记,但 OP 发布了 Windows 答案。
这里的主要挑战,我认为是 OP 的核心问题是在vs中std::precision()
具有不同的含义,而OP 想要在. fixed
default
default
fixed
精度字段与fixed
默认浮点表示法不同。默认情况下,precision 字段指定在小数点前后显示的最大有用位数,可能使用科学计数法,而在 中fixed
,precision 字段准确指定要在小数点后显示的位数。
解决此问题的 2 种方法:将输入字符串更改为数字,然后以新的固定空格格式输出数字 - 如下所示。第二种方法是解析输入字符串并形成新格式 - 这里没有做。
#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;
}