【问题标题】:Can't convert a big double number to string无法将大双精度数转换为字符串
【发布时间】:2020-07-17 15:09:29
【问题描述】:

我有双份

i=0.9500000000000000000000000001;

如何将其转换为字符串?

像这样

“0.95000000000000000000000000001”

【问题讨论】:

  • 顺便说一句;你的双精度不会保持那么高。
  • @ShoortyFTW 因为double 没有那么高的精度。确定一个适合double 的数字,然后使用to_string
  • @ShoortyFTW 为什么您首先需要如此高得离谱的精度?你甚至不需要那么多位数的 Pi 就可以将可观测宇宙的周长计算到一毫米以内。出于所有合理的意图和目的0.9500000000000000000000000001 0.95.
  • @Shorty 然后在散列之前将其截断为合理的长度。散列是一种截断无论如何

标签: c++


【解决方案1】:

看来您要求的精度不仅超出double,而且还超出long double(至少对于我的gcc版本)。对于long double,我建议如下:

#include<iostream>
#include<iomanip>
#include<limits>

int main()
{   
// let's use number 1/3 to test possible limits of long double
long double i = 1.0L/3;

// create a stream
std::ostringstream streamLong;

// set precision to the maximal limit
streamLong << std::fixed << std::setprecision(std::numeric_limits<long double>::digits10 + 1);

// read long double to stream
streamLong << i;

// convert streamLong to a string
std::string i_string = streamLong.str();

std::cout << "i_string=" << i_string << std::endl;

return 0;
}

您可以找到一些其他可能的解决方案here

【讨论】:

  • 不只是超出long double,它超出了原因(除非 OP 可以提供充分的理由)。
  • 我尝试了 long double,但它有一个错误。 0.95000000000000000000000000001 当我尝试打印它时,它向我显示 0.949999999999121 ......类似的东西,所以这不是这样做的方法。即使 setprecision 和 fix 现在可以正常工作,请尝试使用我的数字。打印出来
  • @JesperJuhl ,在科学计算中不时会遇到这些舍入问题,所以你得到的结果是完全错误的。这是相对难以捕捉的错误类型。如果您可以使用更高精度的算术,您至少可以跟踪精度是问题而不是其他错误。
  • @ShoortyFTW 在我替换类似于您的号码 long double i=0.9500000000000000001L; 时对我来说很好。这是我的编译器 (gcc 7.5.0) 可以获得的最高精度。注意数字末尾的L,这是表示它很长。
  • @quantum_dog 我用我的 VS2019 试了一下,得到了这个:i_string=0.9500000000000000
猜你喜欢
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
  • 2020-10-20
  • 2020-12-14
  • 1970-01-01
  • 2011-08-11
相关资源
最近更新 更多