stringstream和double的精度问题

Int*_*idd 1 c++ floating-point precision double

可能重复:
为什么我看到一个双变量初始化为某个值,如21.4为21.399999618530273?

这是我的代码

#include <sstream>
#include <iomanip>
#include <string>
#include <iostream>


int main(int ac, char **av)
{
  if (ac > 1)
    {
      std::string input = av[1];
      std::stringstream ss;
      double output;
      ss << input;
      ss >> output;
      std::cout << std::fixed << std::setprecision(2) << output << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用stringstreams将字符串转换为double.

它很有用,但是当使用非常大的数字时它会非常奇怪:

./a.out 999999999999999999999999
999999999999999983222784.00

./a.out 42
42.00
Run Code Online (Sandbox Code Playgroud)

我该如何处理所有双重值?

Lig*_*ica 6

您无法以任意精度处理"所有双精度值".在您的情况下,您有大约15个十进制数字的精度.写到std::numeric_limits<double>::digits10控制台,你会看到.

请仔细阅读本指南中的浮点运算.