C++ 键入以存储高度精确的小数<;1.

C++ 键入以存储高度精确的小数<;1.,c++,C++,我有一个比我需要存储的数字少的数字。例如,数字如下所示: 0.002937595900 我需要保持所有级别的精度(比如最多12)。将其存储在cpp中最有效的方法是什么?我希望可以使用比使用model/decimal类型更小的东西 有没有其他方法可以保存它 我试图支持的应用程序是存储高达微秒精度的时间,其中数字1表示“1天”,使用谷歌看起来一天有8.64e+10微秒,因此精度约为1/8.64e+10。这取决于您需要的精度。如果您需要确保数字保持在所需值的1/2^52范围内,最好选择双精度。如果您

我有一个比我需要存储的数字少的数字。例如,数字如下所示:

0.002937595900
我需要保持所有级别的精度(比如最多12)。将其存储在cpp中最有效的方法是什么?我希望可以使用比使用model/decimal类型更小的东西

有没有其他方法可以保存它


我试图支持的应用程序是存储高达微秒精度的时间,其中数字1表示“1天”,使用谷歌看起来一天有8.64e+10微秒,因此精度约为1/8.64e+10。

这取决于您需要的精度。如果您需要确保数字保持在所需值的1/2^52范围内,最好选择
双精度
。如果您需要精确的数字位数,而数字是用十进制表示的,那么您提到的boost类可能是您最好的选择

根据您的应用程序,我会将该值存储在一个
:std::uint32_t
中,并在您需要时将其除以
86400000.0
(也称为一天中的微秒数),就像您所说的那样,将其作为缩放数字。当然,使用
::std::uint32\u t
时,您最多只能存储45天左右的时间。因此,如果它变得更大,而您仍然需要所有微秒的精度,请将其存储为
::std::uint64\u t


本质上,你将把你的数字当作一个分数的分子,这个分数的分母是隐式的
86400000

,这取决于其他地方的说法。如果您需要的精度高于
double
,但仍然是固定精度,则可以使用自定义浮点类型实现。如果您需要无限制的精度,您可以使用不同的方法存储此数字。例如,使用两个大整数将其表示为公共分数。

最简单的方法是将微秒数存储在
uint64\t
中。这将允许您存储超过200000000天,因此足以满足您的需要,并且没有舍入错误

另一个解决方案是只使用(内部可能只是一个
int64\t
),然后允许您转换为其他持续时间单位。要返回浮点打印天数,您可以执行以下操作:

#include <iostream>
#include <string>
#include <chrono>

int main()
{
  using namespace std::literals::chrono_literals;
  typedef std::chrono::duration< double, std::ratio<86400> > float_days;
  auto time = 12345678us;
  std::cout << std::chrono::duration_cast< float_days >( time ).count() << " days\n";
}
#包括
#包括
#包括
int main()
{
使用名称空间std::literals::chrono_literals;
typedef std::chrono::durationfloat_days;
自动时间=12345678us;

std::cout(time).count()常规的
双精度
对您不起作用吗?它需要精确到什么程度?@Chipster--老实说,我不确定。我只需要确保它精确到小数点后12位,并且永远不会有舍入错误(例如,像浮点)。另请参见此:。@Omnifarious感谢您的建议,我添加了更多的细节。是的,使用
:std::chrono
类型之一可能比使用裸
::std::uint64\u t
更好。我还没有找到标准库中该部分的良好、内聚的描述,而且所有连锁部分都有点混乱没有一个全面的解释将它们联系在一起。