我正在 C 中进行类型转换,如下
long double dec = 12.32;
long double n = dec - (long long)dec;
当我在点“.”之后打印 n 的 6 位数字时假设 n 是 0.32,它给出 3, 1, 9, 9, 9, 9; 但是当我做这个 Actor 时
double n = dec - (int)dec;
打印正确(3, 2, 0, 0, 0, 0),但我不明白为什么
打印代码就是:
for (int i = 0; i < 6; i++)
{
n *= 10;
printf("%d digit = %d or %lld\n", i, (int) or (long long)n);
n -= (int) or (long long)n;
}
最佳答案
12.32 无法以 C 实现使用的 long double
或 double
格式表示。
long double
中最接近 12.32 的可表示值可能是 12.319999999999999999722444243843710864894092082977294921875。这可以部分解释为什么你的程序显示 3、1、9、9、9 和 9——这些是数字的实际十进制数字。
同样,double
中最接近 12.32 的可表示值可能是 12.32000000000000028421709430404007434844970703125,这可以解释为什么您的程序显示 3、2、0、0、0 和 0。
但是,在您显示的代码中,long double dec = 12.32;
,12.32
是一个 double
常量。即使您将其分配给 long double
,它也应该具有 double
值。因此,这并不能解释为什么您的程序显示 3、1、9、9、9 和 9。您需要 l
后缀使其成为 long double
常量,如long double dec = 12.32l;
。也许您在问题中显示的代码并不完全是您用来生成 3、1、9、9、9 和 9 的代码。
此外,不能依赖代码n *= 10;
来提取数字。这是因为,一般来说,double
或 long double
值乘以 10 的数学结果无法用 double
或 表示。 >long double
格式 - 由于 10 需要三个有效位来表示 (1012•21),因此确切的乘积可能需要比一个双
。因此,精确的数学结果将被四舍五入以适合浮点格式。换句话说,n *= 10;
改变了值;它不只是将其乘以 10。因此它并不总是产生原始数字的数字。
关于c - 类型类型转换 long double 到 long long,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55987095/