C语言用scanf为浮点数赋值后,输出的数与输入的数不同

出的问题真的莫名其妙

{
    float num = 0;
    printf( "请输入一个小数:" );
    scanf( "%f", &num );
    printf( "你输入的值存储在浮点类型中后变成了:%f", num );
    return 0;
}

img


上图是后缀为.c时的运行结果

img


上图是后缀为.cpp时的结果

浮点数里存的是个近似值。

这是很正常的,因为浮点数存储大小有限,存在尾数误差,而printf并不智能地判断float的有效位数,它会自以为是地一顿输出

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7638736
  • 除此之外, 这篇博客: C语言的格式化输出与输入中的 scanf函数的使用 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

    接下来我们还是来看看scanf怎么使用的
    实际上,scanf和printf函数一样是由格式串控制的,每次你调用的狮虎,scanf函数从左边开始处理字符串的信息,对于每一个格式串的说明,scanf都会去执行,另外说一下scanf函数的注意事项
    1.scanf函数读取数据成功,会继续处理剩下的字符串。
    2.scanf函数读取数据项,如果某一项读取不成功,那么就立即停止,不再继续往下读取数据。
    3.另外在寻找数的起始位置时候,scanf会忽略空白字符串。(换行符,空格符。垂直制表符)
    第三点就例如下图这种现象
    在这里插入图片描述
    这里是因为。scanf函数会把输入的字符,看成连续的字符流,而且scanf函数在寻找每个数的起始位置的时候,会跳过空白符。所以它能成功的读取这些数。

    这里我会列出一些scanf格式化类型说明

    类型合格的输入参数的类型
    %a、%A读入一个浮点值(仅 C99 有效)。float *
    %c单个字符:读取下一个字符。如果指定了一个不为 1 的宽度 width,函数会读取 width 个字符,并通过参数传递,把它们存储在数组中连续位置。在末尾不会追加空字符。char *
    %d十进制整数:数字前面的 + 或 - 号是可选的。int *
    %e、%E、%f、%F、%g、%G浮点数:包含了一个小数点、一个可选的前置符号 + 或 -、一个可选的后置字符 e 或 E,以及一个十进制数字。两个有效的实例 -732.103 和 7.12e4float *
    %i读入十进制,八进制,十六进制整数 。int *
    %o八进制整数。int *
    %s字符串。这将读取连续字符,直到遇到一个空格字符(空格字符可以是空白、换行和制表符)。char *
    %u无符号的十进制整数。unsigned int *
    %x、%X十六进制整数。int *
    %p读入一个指针 。
    %[]扫描字符集合 。
    %%读 % 符号。

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^