stringstream和double的精度问题

时间:2011-02-20 13:43:05

标签: c++ floating-point double precision

  

可能重复:
  Why do I see a double variable initialized to some value like 21.4 as 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;
    }
}

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

它可以工作,但是当使用非常大的数字时它会非常奇怪:

./a.out 999999999999999999999999
999999999999999983222784.00

./a.out 42
42.00

我如何处理所有双倍值?

1 个答案:

答案 0 :(得分:6)

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

阅读this guide to floating-point arithmetic