我要存储的号码少于一个。例如,数字看起来像这样:
0.002937595900
我需要保持所有级别的精度(比如说最高为12)。将其存储在cpp中最有效的方法是什么?我希望可以使用比使用boost模型/小数类型的东西小的东西。
我还有其他存储方式吗?
我要支持的应用程序是存储时间精度最高为微秒,其中数字1表示“ 1天”,使用Google看起来一天中有8.64e + 10微秒,所以1 / 8.64e + 10精度。
答案 0 :(得分:3)
这取决于您需要哪种精度。如果您需要确保数字保持在所需值的1/2 ^ 52左右,那么double
是最好的选择。如果您需要一个精确的数字精度(以十进制表示),那么您提到的提升级别可能是最好的选择。
鉴于您的应用程序,我会将值存储在::std::uint32_t
中,并在需要时将其除以86400000.0
(也就是一天中的微秒数),就像以前一样在谈论。当然,使用::std::uint32_t
最多只能存储大约45天的时间。因此,如果它变得更大,并且仍然需要所有微秒的精度,请将其存储为::std::uint64_t
。
本质上,您会将数字视为分母为隐式86400000
的分数的分子。
答案 1 :(得分:3)
最简单的方法是将微秒数存储在uint64_t
中。这样一来,您可以存储超过2亿天,因此可以满足您的需求,而且没有舍入错误。
另一种解决方案是只使用std::chrono::microseconds
(内部可能只是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";
}
答案 2 :(得分:0)
正如其他地方所说,这取决于。如果您需要高于double
的精度但仍然是固定的精度,则可以使用自定义浮点类型实现。如果您需要无限的精度,则可以采用其他方式来存储此数字。例如,使用两个大整数将其表示为普通分数。