如何'cout'双值的正确小数位数?

Cha*_*han 27 c++ precision double tostring

我需要帮助来保持精确度double.如果我将文字分配给double,则实际值会被截断.

int main() {
    double x = 7.40200133400;
    std::cout << x << "\n";
}
Run Code Online (Sandbox Code Playgroud)

对于上面的代码片段,输出7.402
是否有办法防止这种类型的截断?或者有没有办法计算出多少浮点数double?例如,number_of_decimal(x)会给出11,因为输入在运行时是未知的,所以我不能使用setprecision().


我想我应该将我的问题改为:如何在不截断浮点的情况下将double转换为字符串.即

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

template<typename T>
std::string type_to_string( T data ) {
    std::ostringstream o;
    o << data;
    return o.str();
}

int main() {
    double x = 7.40200;
    std::cout << type_to_string( x ) << "\n";
}
Run Code Online (Sandbox Code Playgroud)

预期产量应为7.40200,但实际结果为7.402.那么我该如何解决这个问题呢?任何的想法?

fre*_*low 31

由于事实floatdouble内部存储二进制,文字7.40200133400实际上代表数字7.40200133400000037653398976544849574565887451171875

......你真的想要多少精确度?:-)

#include <iomanip>    
int main()
{
    double x = 7.40200133400;
    std::cout << std::setprecision(51) << x << "\n";
}
Run Code Online (Sandbox Code Playgroud)

是的,这个程序真的打印7.40200133400000037653398976544849574565887451171875!

  • setprecision需要#include <iomanip> (10认同)
  • @Chan:为什么?因为你在源文件中写了"7.40200133400"?这是不可能的,因为对于编译器,文字"7.402001334","7.40200133400"和"7.402001334000000"是等价的.它们都产生相同的值,然后存储在`x`中.没有关于你最后写下多少零的额外信息. (2认同)
  • @Chan:如果你想要的只是从文本文件中读取一个数字然后打印它(不进行任何计算),你为什么不把它作为`std :: string`而不是`double`来读? (2认同)

Max*_*xpm 18

你必须使用setiosflags(ios::fixed)setprecision(x).

例如, cout << setiosflags(ios::fixed) << setprecision(4) << myNumber << endl;

另外,别忘了#include <iomanip.h>.

  • +1 for ios :: fixed as:setiosflags(ios :: fixed)有助于num ==(int)num的情况,允许以2.00的格式输出数字,不输出将是2 (2认同)

Kos*_*Kos 9

std::cout << std::setprecision(8) << x;
Run Code Online (Sandbox Code Playgroud)

请注意,这setprecision是持久性的,您打印的所有下一个浮动将以该精度打印,直到您将其更改为其他值.如果这是一个问题而你想解决这个问题,你可以使用代理stringstream对象:

std::stringstream s;
s << std::setprecision(8) << x;
std::cout << s.str();
Run Code Online (Sandbox Code Playgroud)

有关iostream格式的更多信息,请查看cppreference中的输入/输出操纵器部分.

  • @Chan:所有浮点数都具有相同的精度. (3认同)

Dan*_*röm 5

使用Boost.Format的解决方案:

#include <boost/format.hpp>
#include <iostream>

int main() {
    double x = 7.40200133400;
    std::cout << boost::format("%1$.16f") % x << "\n";
}
Run Code Online (Sandbox Code Playgroud)

这输出7.4020013340000004.

希望这可以帮助!