如何在c ++中使用指定的精度数将字符串转换为double

时间:2016-03-11 07:03:58

标签: c++ string double precision

如何在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  

4 个答案:

答案 0 :(得分:4)

基本上,您可以使用strtodstd::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;
}

Live Demo

答案 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个单位和分别分别为100001001110001111101110001111110110000010011001011011001100110。因此,这导致(-1)符号的值×2 指数×(1.significand bits)= 1×2 40 ×1.1228329550462148311851251492043957114219 = 1234567890123.39990234375。

请注意,即使是128位浮点也不会精确地存储该值。它仍然会导致1234567890123.39999999999999999999991529670527456996609316774993203580379486083984375。也许您应该尝试使用一些定点或有理数字类型。