c++ - C - 打印 float - 转换为 int 时精度损失

标签 c++ c casting output

我正在尝试创建一个可以打印 float 的函数。 现在,我遇到两种奇怪的行为: 有时,像 1.3 这样的值会显示为 1.2999999 而不是 1.3000000,有时像 1.234567 这样的值会显示为 1.2345672 而不是 1.2345670。

这是源代码:

int     ft_putflt(float f)
{
    int     ret;
    int     intpart;
    int     i;

    ret = 0;
    i = 0;
    intpart = (int)f;
    ft_putnbr(intpart);
    ret = ft_nbrlen(intpart) + 8;
    write(1, ".", 1);
    while (i++ < 7)
    {
        f *= 10;
        ft_putchar(48 + ((int)f % 10));
    }
    return (ret);
}

据我所知,ft_putnbr 没问题。 ft_putchar 是对“write(1, &c, 1)”的简单调用。

test values (value : output)

1.234567  : 1.2345672 (!)

1.2345670 : 1.2345672 (!)

1.0000001 : 1.0000001 OK

0.1234567 : 0.1234567 OK

0.67      : 0.6700000 OK

1.3       : 1.3000000 OK (fixed it)

1.321012  : 1.3210119 (!)

1.3210121 : 1.3210122 (!)

这一切对我来说似乎有点神秘......转换为 int 时可能会损失精度?

最佳答案

是的,当弄乱 float 和整数时,你会失去精度。

如果两个 float 的大小不同,并且都使用完整的精度范围(大约 7 个十进制数字),那么是的,您会在最后几位看到一些损失,因为 float 以(符号)(尾数)的形式存储) × 2(指数)。如果两个值具有不同的指数并且您将它们相加,则较小的值将减少到尾数中更少的数字(因为它必须适应较大的指数):

PS> [float]([float]0.0000001 + [float]1)
1

相对于整数,普通的 32 位整数能够精确地表示不能完全适合 float 的值。 float 仍然可以存储大约相同的数字,但不再精确。当然,这只适用于足够大的数字,即。 e.长于 24 位。因为浮点有 24 位精度,而(32 位)整数有 32 位,所以浮点仍然能够保留大小和大部分有效数字,但最后的位置可能会有所不同:

PS> [float]2100000050 + [float]100
2100000100

关于c++ - C - 打印 float - 转换为 int 时精度损失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26746416/

相关文章:

c++ - sqlConnection->Open() 不起作用

c - 订阅值既不是数组也不是指针

c++ - 如何将字节数组转换为整型(int、long、short等) 'endian safely'?

C++ 调用模板函数错误

c++ - clang 代码补全 - 实现设计

c++ - 使用 boost 传递函数指针参数

c - 为什么数组中的 char 在 gcc 中为 newlib 中的 isspace 给出下标警告

编译器函数和可执行文件

java.lang.ClassCastException : java.net.URI 无法转换为 java.net.URL

java.lang.ClassCastException : entity. SysLogEntity 无法转换为实体.SysLogEntity