将 double 转换为 int 而不四舍五入

标签 c

我不明白为什么当我尝试将我的 double 转换为逗号四舍五入后的 int 值时..

void print_float(double nb)
{
    int negative;
    int intpart;
    double decpart = -10.754;
    int v;

    negative = (nb < 0.0f);
    intpart = (int)nb;
    decpart = nb - intpart;
    v = (int)(decpart * 1000);

    if (negative) {
        v *= -1;
    }

    printf("%i.%i", intpart, v); // output: -10.753
}

我以为担心来自类型转换,但我不明白这个问题..

最佳答案

double 无法准确编码所有数字。它可以精确编码大约 264 个不同的值。 -10.754 不是其中之一。取而代之的是,使用的附近值比预期的要少。

printf("%.24f", -10.754);
// -10.753999999999999559463504

decpart * 1000 部分引入了一些不精确,但乘积仍低于 754.0,然后 (int) 转换为 753。

关于将 double 转换为 int 而不四舍五入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54219110/

相关文章:

中断处理程序中的 C printf()?

持有指向另一个结构的指针的 C 结构如何访问该内部结构指针的成员

c - Sonar C++ 社区插件

c - fgets、sscanf 和写入数组

Promela/Spin 中 C 包含的 Python 文件 : 'inline text too long'

c - Windows 上的 limits_h 宏 (C)

c - C语言中使用fork()创建进程树

c - 发送 ptrace 信号后获取僵尸进程