繁体   English   中英

如何在C ++中将字符串转换为具有指定精度的双精度数

[英]How to convert string to double with specified number of precision in c++

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

基本上,您可以使用strtodstd::stod进行转换,然后舍入到所需的精度。 对于实际的四舍五入,网络搜索将提供许多代码示例。

但是细节比您想象的要复杂:字符串是(可能是)数字的十进制表示形式,而double是二进制的。 我想您想舍入到指定数量的十进制数字。 问题在于大多数十进制浮点十进制数字不能精确地用二进制表示。 即使对于像0.1这样的数字,也不可能。

您还需要定义您对哪种精度感兴趣。它是总位数(相对精度)还是小数点后的位数(绝对精度)。

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位数-

std::cout << std::fixed;
std::cout << std::setprecision(2);
std::cout << value;

您可以为精度指定任意数字。

浮点double类型不能完全表示 1234567890123.4的值,而1234567890123.3999是它可以表示的最佳值,这就是结果。 请注意,浮点类型(例如IEEE-754)不能完全表示所有实数,因此在大多数情况下,它们使用近似值。

为了更加精确,根据IEEE-754双精度浮点格式1234567890123.4被表示为十六进制值4271F71FB04CB666 ,其中以二进制符号位是0 ,则11指数和52 singificand位是100001001110001111101110001111110110000010011001011011001100110分别。 因此,这导致(-1) 符号 ×2 指数 ×(1。有效位)的值= 1×2 40 ×1.1228329550462148311851251492043957114219 = 1234567890123.39990234375。

请注意,即使是128位浮点数也无法准确存储该值。 仍然会导致1234567890123.39999999999999999999991529670527456996609316774993203580379486083984375。 也许您应该改为尝试使用一些定点或有理数类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM