2011-12-14 142 views
1
#include "stdafx.h" 
#include "stdio.h" 
#include "math.h" 

int main() 
{ 
float c; 

printf("Type c"); 

scanf("%f", &c); 


    printf("C is c: %f ",c); 

    while(getchar()!='\n'); 
    getchar(); 
    return 0; 

    } 

非常简单的代码,我刚开始与C 对于大多数数字工作正常,但是,例如,如果我输入47.2然后打印我47.200001与88.4321输出88.432098 但与其他号码,如5.4工程确定5.400000 我使用Microsoft Visual Studio 10.scanf浮点数,打印浮点数,不同的值?

另一件事,如果上面的代码,而不是把float c我把双我不能够printf我应该把什么,而不是%f? 但它更担心我的第一个问题,也许这是与编译器有关,也许我正在编译C代码作为C++,我不知道。

+1

%lf将打印双打 – 2011-12-14 21:28:02

+0

`%lf`和`double` ftw – Nakilon 2012-11-28 12:37:26

回答

0

关于您的数字准确性。以二进制格式存储浮点值时,这是一个已知问题。从PHP文档稍微修改...

浮点数的精度有限。虽然它取决于系统,但大多数语言通常使用IEEE 754双精度格式,由于舍入顺序为1.11e-16,因此会产生最大相对误差。非基本的算术运算可能会导致更大的错误,当然,当多个运算复合时,必须考虑错误编程。

此外,基数10中的浮点数(如0.1或0.7)可以精确表示的有理数作为基数2中的浮点数没有精确的表示,在内部使用该浮点数,无论大小尾数。因此,他们不能被转换成其内部的二进制对应,而不会有小的精度损失。这可能导致令人困惑的结果:例如,floor((0.1 + 0.7)* 10)通常会返回7而不是预期的8,因为内部表示将类似于7.9999999999999991118 ....

因此永远不要相信浮点数结果到最后一位,并且从不比较浮点数是否相等。

如果您需要更高的精度,您可能需要调查其唯一目的是处理高精度数字的辅助库。