我在C中有一个字符串指针,它有bigint数据。
例如9223372036854775807
,即2^63
我想把它转换为double,但是你知道double有15/16位可用于存储在小数部分,其余的位被丢弃。所以上面的数字非常大,将被转换为{{1} } {ie 9.22337203685476E+18
。
这使得比较原始值和铸造值不匹配。这通常发生在Linux平台上。这就是为什么在Windows上不会发生这种情况的原因?
是编译器依赖还是我不知道的东西。 ?
答案 0 :(得分:0)
该值为2^63 - 1
,无法用double
精确表示。可以表示的最接近的值是2^63
。如果你使用例如,那就是你得到的sscanf
或atof
:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
const char *str = "9223372036854775807";
double d;
double e;
sscanf(str, "%lf", &d);
e = atof(str);
printf("%f\n", d); // 9223372036854775808.000000
printf("%f\n", e); // 9223372036854775808.000000
}