浮点到整数除法可以提高精度,但不明白为什么 [duplicate]

Floating-point to integer division increases the precision but don't understand why [duplicate]

提问人:user3363546 提问时间:3/25/2023 最后编辑:user3363546 更新时间:3/25/2023 访问量:75

问:

我正在浏览一个 C 应用程序代码,发现整数除法的浮点数提高了精度,我不明白为什么。 例如,将浮点数 12926.0 除以整数 100 应该得到 129.26,但我得到的结果却是 129.259995

下面是实际代码的简单代码表示形式。

#include<stdio.h>
#include<stdlib.h>

void main()
{
    int i=12926;
    float k=0.0;

    k=(float) i / 100;

    printf("k <%f>\n",k);
}

我已经搜索了解释并尝试在 GDB 中调试时评估值和表达式 -

(gdb) print 12926.0 / 100.0
$39 = 129.25999999999999
(gdb) print (float) i / 100
$40 = 129.259995
(gdb) print i / 100
$41 = 129

困惑于为什么 C 将结果显示为 129.259995 而不是 129.26。有没有办法控制精度长度以获得 129.26 的结果?

c 浮点 精度

评论

0赞 Eric Postpischil 3/25/2023
你的头衔是什么意思? 在您的程序中使用除法。 在调试器中使用除法。'(float) i / 100' 在调试器中使用除法。它使用整数除数(转换为匹配分子),但结果并不比运算更准确,也没有更精确地显示。 使用整数除法,其结果并不比浮点运算更准确。“浮点到整数除法提高了精度”是什么意思?k=(float) i / 100float12926.0 / 100.0doublefloatfloatdoublei / 100
0赞 chux - Reinstate Monica 3/25/2023
@user3363546,“将浮点数 12926.0 除以整数 100 应得到 129.26”是不正确的。 通常可以精确编码近 2^32 个不同的值。 不是其中之一。最接近的正好是 129.2599945068359375。将其打印到 129.259995 之后的 6 位。float129.26float.

答:

1赞 Harith 3/25/2023 #1

来自 的手册页:printf()

f、F double 参数四舍五入并转换为十进制 样式为 [-]ddd.ddd 的表示法,其中 小数点字符后的数字等于 精密规格。如果缺少精度,则 取 6;如果精度显式为零,则否 出现小数点字符。如果小数点 出现时,至少有一个数字出现在它之前。


有没有办法控制精度长度得到 129.26 作为 结果?

是,指定精度:

printf("k <%.2f>\n",k);

评论

0赞 user3363546 3/25/2023
谢谢哈里斯,这确实回答了我的第二个问题。但是,如果未指定精度,为什么结果是 129.259995 而不是 129.260000?
0赞 Harith 3/25/2023
请参阅重复的答案。