如何在c ++中使用指定的精度数将字符串转换为double 代码段如下:
double value;
CString thestring(_T("1234567890123.4"));
value = _tcstod(thestring,NULL);
The value is coming as this:1234567890123.3999
expected value is:1234567890123.4
答案 0 :(得分:4)
基本上,您可以使用strtod
或std::stod
进行转换,然后四舍五入到您想要的精度。对于实际的舍入,网络搜索将提供大量代码示例。
但细节比你想象的要复杂得多:字符串(可能)是数字的十进制表示,而double是二进制。我想你想要舍入到指定的十进制数字。问题是大多数十进制浮点十进制数不能用二进制精确表示。即使对于像0.1这样的数字也是不可能的。
您还需要定义您感兴趣的精度类型。它是总位数(相对精度)还是小数点后的位数(绝对精度)。
答案 1 :(得分:0)
std::stod
是通用的,不会给出这种操作。因此,你必须自己制作一些东西,就像我在下面使用std::stringstream
和<iomanip>
设施所做的那样:
double stodpre(std::string const &str, std::size_t const p) {
std::stringstream sstrm;
sstrm << std::setprecision(p) << std::fixed << str << std::endl;
double d;
sstrm >> d;
return d;
}
答案 2 :(得分:0)
您无法控制存储十进制数的精度。 十进制数使用浮点表示法以二进制形式存储。
您可以做的是控制输出数字时显示的精确度。
例如,执行此操作可将输出的精度控制为2位数 -
std::cout << std::fixed;
std::cout << std::setprecision(2);
std::cout << value;
您可以为精确度提供任何数字。
答案 3 :(得分:0)
浮点double
类型无法准确表示值1234567890123.4
,而1234567890123.3999
是它可以表示的最佳值,结果是。请注意,浮点类型(例如IEEE-754)不能精确地表示所有实数,因此在大多数情况下使用近似值。
更准确地说,根据IEEE-754,双精度浮点格式1234567890123.4
表示为4271F71FB04CB666
的十六进制值,其中二进制符号位为0
, 11指数和52个单位和分别分别为10000100111
和0001111101110001111110110000010011001011011001100110
。因此,这导致(-1)符号的值×2 指数×(1.significand bits)= 1×2 40 ×1.1228329550462148311851251492043957114219 = 1234567890123.39990234375。
请注意,即使是128位浮点也不会精确地存储该值。它仍然会导致1234567890123.39999999999999999999991529670527456996609316774993203580379486083984375。也许您应该尝试使用一些定点或有理数字类型。