c - 浮点值输入错误

标签 c floating-point

使用浮点值时,我不知道为什么我的 C 编译器或系统表现异常。不让它变得如此困惑。这是一个简单的程序,用于获取浮点值输入并打印相同的值。

#include <stdio.h>

int main()
{
    float num;

    printf("Enter float value ");
    scanf("%f", &num);

    printf("Value = %f", num);

    return 0;
}

多次运行相同的代码会给出不同且奇怪的输出。以下是一些示例运行。

示例运行 #1 正确输出

Enter float value 12.0312
Value = 12.031200

示例运行#2 不正确且意外的输出

Enter float value 324.123
Value = 324.122986

示例运行 #3 不正确且意外的输出

Enter float value 945.1234
Value = 945.123413

我不知道为什么系统在最后添加了一些垃圾值。我在 code::blocks 中使用 GNU GCC 编译器。

最佳答案

您的float无法准确表示每个可以想象的数字。它有局限性。与 "324.123" 最接近的 float324.122986...

如果您需要更高的精度,请使用double,但即使这样也有其局限性。

float 将是正确的(匹配类似的有限输入)至少 FLT_DIG 有效位。要将数字打印为 FLT_DIG 有效数字,请使用:

printf("%.*e", FLT_DIG - 1, num);
<小时/>

FLT_DIG 至少为 6。

number of decimal digits, q, such that any floating-point number with q decimal digits can be rounded into a floating-point number with p radix b digits and back again without change to the q decimal digits, ... C11dr §5.2.4.2.2 11

关于c - 浮点值输入错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32231088/

相关文章:

c++ - float 的类内静态 const 初始化与 C++ 中的 int 有何不同?

即使使用缩放值,Javascript 金融浮点也会出现错误

java - Kotlin float -> 字符串转换问题(也是 Java)

c - 学校编程类问题(Visual Studio)

c - 可以在另一个 .c 文件中包含一个 .c 文件吗?

c - 在整个函数中保留 C 内存

C# 小数类型相等

c - c 中的 double 比较失败

C:程序在完成 for 循环之前崩溃

c - 释放指针重新分配自身?