c - 类型类型转换 long double 到 long long

标签 c types

我正在 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 doubledouble 格式表示。

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;来提取数字。这是因为,一般来说,doublelong double 值乘以 10 的数学结果无法用 double 表示。 >long double 格式 - 由于 10 需要三个有效位来表示 (1012•21),因此确切的乘积可能需要比一个。因此,精确的数学结果将被四舍五入以适合浮点格式。换句话说,n *= 10; 改变了值;它不只是将其乘以 10。因此它并不总是产生原始数字的数字。

关于c - 类型类型转换 long double 到 long long,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55987095/

相关文章:

c - 无法反转链表

c - 除了 strtok 之外,还有另一种使用逗号分隔符拆分字符串的方法吗?

c - 这个表达式是什么意思,为什么编译?

java - 原始类型和引用类型有什么区别?

r - 使用 R 中 readr 中的 read_csv 将文本作为指定列以 [type] 打开

c - 为什么当我从 `double` 函数返回 `void *` 时,它变得不兼容?

c - 为什么我不能用 i = -1 初始化循环?

Haskell where 类型声明

java - Java 中的基本类型

c++ - 基于 32 位和 64 位系统的 C 或 C++ 语言的数据类型大小有何不同