【发布时间】:2018-07-12 03:49:10
【问题描述】:
我正在尝试将 c 中的简单字符串转换为双精度:
double n;
sscanf_s(str, "%lf", &n);
printf("%lf", n);
考虑到:
const char *str[] = {"37107287533902102798797998220837590246510135740250"};
当我尝试打印 n 时,直到第 16 位数字都很好。输出是这样的:
371072875339021043110257403....
可能是什么问题?
【问题讨论】:
-
因为 C 中的浮点类型的精度有限(double-precision IEEE-754 约为 15-17 位)。 Double precision - decimal places。在某些平台上,您可以使用
long double来获得更多数字,尽管Decimal Precision Lost after 15th Digit - Bad PI -
因为浮点数有点像科学记数法。您的数字在内部表示为相当于 3.710728753390210 x 10^49 的二进制数,而尾数中您只能得到小数点后约 15 位。
-
在普通机器上的普通编译器下没有任何类型可以让您以全精度表示像 37107287533902102798797998220837590246510135740250 这样的数字。 (该数字至少需要 165 位。)您必须使用单独的任意精度库。