Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将int64定点转换为双精度?_C++ - Fatal编程技术网

C++ 如何将int64定点转换为双精度?

C++ 如何将int64定点转换为双精度?,c++,C++,我正在使用int64存储我的decimal值。在Financial中,我需要“精确”值,因此我必须使用base 10而不是base 2。我在全球范围内有: typedef int64_t myDecimal; const int DECIMALS_GLOBAL = 10; I将每个值“乘以”到10^10 比如说 1 is 10000000000 0.001 is 10000000 现在我需要将myDecimal转换为double。听起来很简单,我只能((double)myDecValue)/

我正在使用
int64
存储我的
decimal
值。在Financial中,我需要“精确”值,因此我必须使用
base 10
而不是
base 2
。我在全球范围内有:

typedef int64_t myDecimal;
const int DECIMALS_GLOBAL = 10;
I将每个值“乘以”到
10^10
比如说

1 is 10000000000
0.001 is 10000000
现在我需要将
myDecimal
转换为
double
。听起来很简单,我只能
((double)myDecValue)/10^10
,但这很危险,因为
double
很可能无法存储“大”int64值。所以我写了这样的函数:

int64_t posPow10_64[] = {
1,
10,
100,
1000,
10000,
100000,
1000000,
10000000,
100000000,
1000000000,
10000000000,
100000000000,
1000000000000,
10000000000000,
100000000000000,
1000000000000000
};

double Utils::MyDecimalToDouble(myDecimal value) {
    int beforeDot = value / posPow10_64[DECIMALS_GLOBAL];
    return (double) beforeDot + ((double) (value - beforeDot * posPow10_64[DECIMALS_GLOBAL])) / posPow10_64[DECIMALS_GLOBAL];
}
我认为这个函数的风险较小,因为我将其转换为两倍的值,这个值要小得多,但这个函数看起来非常复杂,而且可能很慢

您有什么建议吗?我的问题很常见,如何转换为双精度快速、简单且安全?

关于“双精度很可能无法存储“大”int64”,这取决于您的意思是否准确。由于您正在执行十进制定点,除非实现的
double
类型恰好是十进制(原则上可以是十进制,而不是必须是二进制的整数),否则您拥有的大多数值都无法准确存储。例如,0.2不能与任何普通的
double
类型一起精确存储,因为它不能精确地表示为2的幂和

然而,如果它不能被准确地存储,那么它就不能被准确地存储,并且没有多少智能转换设备可以解决这个问题

通常,
double
是64位IEEE浮点,精度约为52位,范围远大于64位整数,因此大小没有问题



总之,您可以只做
double(myDecValue)/1000000000
(注意
10^10
是一个位级异或表达式)。

这似乎是一个非常非常糟糕的设计…@MitchWheat为什么?对于C++中的代码> >十进制< /代码>,你有什么建议?请使用San STAT,使用已建立的BigNem类库。要么使用BigDigMalor,要么存储整分值。它已经被证明不能精确地表示一个双倍中所需的每一个值,而没有任何一个体操会改变这一点。他们只会重新分配舍入误差(通常情况更糟)。
int64
的范围是–9223372036854775808到9223372036854775807。你认为我能在不丢失任何信息的情况下,将9223372036854775807投给doulbe吗?如果(In64)(double)922337203685477580=922337203685477580?@ javaPoWoWi:如所提到的,在不丢失信息(对于普通C++实现)的情况下,您甚至不能将0.2转换为<代码> double <代码>。显然,您有两个相互排斥的要求:(1)转换为
double
,以及(2)在任何情况下都不要丢失信息。然后你必须放弃至少一个要求。我可以提供合理数量的信息。当然,我会失去信息时,铸造双。但它似乎有很多漏洞。我尝试过这个
std::cout@javapowered:输出取决于您的输出设置。将固定格式和精度设置为16到18位。这应该被你的C++教科书所覆盖吗?