gpt4 book ai didi

C 格式字符串 printf ("%lld") 错误结果

转载 作者:行者123 更新时间:2023-11-30 19:16:01 25 4
gpt4 key购买 nike

long long temp_number;
float input = 0.7f;
temp_number = input*100;
printf("%lld",temp_number);

有人能解释一下为什么我得到 69 而不是 70 吗?

最佳答案

这里没有什么神秘的。它类似于将 1/3 写为十进制 0.333333~(~ 表示“重复”),然后乘以 3。答案是0.999999~而不是1,我希望你能看到这与计算机科学无关。

您已将 float 转换为 long long int,编译器警告这样做可能会导致数据丢失。但在转换为不同类型之前,您需要乘以 100,所以让我们更多地看一下 float 示例。

十进制值0.7无法以二进制float格式精确表示。当您将 printffloat 一起使用时,它会舍入尾数的最低有效位来处理该问题。所以当我这样做时

float f = 0.7f;
printf("%f\n", f);

输出是我想要的0.700000。但是,当我将 float 值乘以 100 时,尾数的最低有效位会产生更大的误差,而之前的误差仅为 1。所以现在使用

float f = 0.7f;
printf("%f\n", f*100);

输出为 69.999999,因为向上舍入最低有效位不会使数字累计到 70.000000

回到 1/3 的十进制表示的第一个示例,但存储大小有限,例如 10 位十进制数字为 0.333333333。乘以 3 得到 9.999999999,四舍五入最后一位数字将得到 1.000000000。但乘以 30 会得到 9.999999990,并且向上舍入最后一位数字不会产生 10.00000000

C 语言不“知道”数字的 float 表示形式会截断循环分数。也许有一种数字类型可以保存这些信息并相应地计算算术函数。

关于C 格式字符串 printf ("%lld") 错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31248579/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com