如何防止双值被截断? 这是一个可重复的C++程序: #include <RInside.h> #include <Rcpp.h> int main (int argc, char *argv[]) { RInside R (argc, argv); SEXP ans = R.parseEval ("m <- 40.702147"); Rcpp::NumericVector v (ans); for (int i=0; i< v.size(); i++) { std::cout << "In C++ element " << i << " is " << v[i] << std::endl; } return 0; }

如何防止双值被截断? 这是一个可重复的C++程序: #include <RInside.h> #include <Rcpp.h> int main (int argc, char *argv[]) { RInside R (argc, argv); SEXP ans = R.parseEval ("m <- 40.702147"); Rcpp::NumericVector v (ans); for (int i=0; i< v.size(); i++) { std::cout << "In C++ element " << i << " is " << v[i] << std::endl; } return 0; },c++,C++,此程序的输出: In C++ element 0 is 40.7021 问题是值40.702147被“截断”为40.7021 我要满满的。 解决方法是什么?值本身没有被截断(a),cout输出流使用默认值进行输出 您可以查看iomanip标题,找到强制特定输出格式的方法,例如: std::cout << std::setprecision (9) << v[i] << '\n'; (a) :请记住,如果它不能准确表示为IEEE754双精度值,则可能会被

此程序的输出:

In C++ element 0 is 40.7021

问题是值
40.702147
被“截断”为
40.7021

我要满满的。

解决方法是什么?

值本身没有被截断(a),
cout
输出流使用默认值进行输出

您可以查看
iomanip
标题,找到强制特定输出格式的方法,例如:

std::cout << std::setprecision (9) << v[i] << '\n';


(a) :请记住,如果它不能准确表示为IEEE754双精度值,则可能会被截断,但这里的情况并非如此-双精度约有15位小数,而您只能看到6位。

您可以通过以下方式指定
std::cout
精度:

std::cout.precision(16);
或使用

std::cout << std::setprecision (9) << val;

std::cout可能它被“截断”,但它肯定没有被截断!:-)@H2CO3:因为<代码> %921F 比C++类型意识>代码> SETXXX < /COD> I/O操作器好吗?如果你要对C++代码,就对它进行编码。不要处于混合状态。正如尤达所说:“不,尽量不要,做或不做”:-)重复性好。最低限度的重复性更好。一点努力可能会产生一个两行C++程序,显示出同样的问题,那么你就不需要所有不必要的代码和标签,你就可以把问题集中在C++程序员而不是拖拽R用户了!但当问题与R无关时,将其标记为R意味着问题出现在我们的“仪表盘”上。我们看了看。问题与R无关,我们叹了口气……:)@Spacedman我的印象是R没有给出完整的双倍值。没有问我,我不可能知道得更好!我花了几个小时在google上试图在R中找到另一个可以处理双值的函数。谢天谢地,我终于决定提问。或者在流中内联使用I/O操纵器。我“非常”高兴。我很担心R的数值向量会产生截断值。我花了大量的时间在R中找出一个更好的函数:该死:
40.7021
40.702147
std::cout.precision(16);
std::cout << std::setprecision (9) << val;