2015-08-26 105 views
-3

使用浮点值我不知道为什么我的C编译器或系统意外行为。没有让它变得如此混乱。这里是一个简单的程序,用于输入浮点值并打印。浮点值输入错误

#include <stdio.h> 

int main() 
{ 
    float num; 

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

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

    return 0; 
} 

在多次运行相同的代码给我不同和怪异的输出。以下是一些示例运行。

样品试验#1 正确的输出

输入浮点值12.0312
值= 12.031200

样品试验#2 不正确的和意想不到的输出

输入浮点值324.123
值= 324.122986

样品试验#3 错误和意外的输出

输入浮点值945.1234
值= 945.123413

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

+3

系统不是”添加垃圾数值“。浮点表示本质上不精确(它们不代表实数,它们表示有理数的子集)。 –

+0

http://floating-point-gui.de/ – pm100

+0

感谢大家明确表示。并为链接。这是我发现我的问题的正确答案http://stackoverflow.com/questions/588004/is-floating-point-math-broken。如果其他人有这个问题,这个链接可以帮助。 –

回答

3

你的float不能准确地代表每一个可以想象的数字。它有局限性。最接近的float"324.123"324.122986...

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

A float将是正确的(匹配类似限制的输入)至少FLT_DIG显着数字。要打印的数FLT_DIG显著位数使用:

printf("%.*e", FLT_DIG - 1, num); 

FLT_DIG是至少为6。

号码的十进制数字,Q,使得其中q十进制数字任何浮点数可以四舍五入成为一个带有p基数b位数的浮点数,然后再次返回而不改变为q十进制数,... C11dr§5.2.4.2.211

+0

是否存在['std :: numeric_limits :: max_digits10'](http://en.cppreference.com/w/cpp/types/numeric_limits/max_digits10)的C等价物? – legends2k

+0

@ legends2k是的。看起来'max_digits10'就像'FLT_DECIMAL_DIG/DBL_DECIMAL_DIG','digits10'就像'FLT_DIG/DBL_DIG'。 – chux

+0

C11似乎只有[DECIMAL_DIG](http://en.cppreference.com/w/c/types/limits)。然而,如果需要的话,可以定义一个宏,所以应该没问题,我猜。 – legends2k

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

如果需要,它会增加一些值: 输入浮点值945.1234 值= 945。123413

因为浮点值始终在小数点后打印6位

避免这种情况,你可以使用语句,如: 的printf( “VALUE =%.3f”,NUM);

这会给你一个愿望输出,只要你想 将小数点 你可以设置按您的要求像 “%.2f”后打印只有三个数字 - 小数点后 > 2号“ %.3f“ - >为小数点后面的3位数字 ”%.4f“ - >为小数点后面的4位数字