JavaXQ 2016-04-11 09:09 采纳率: 100%
浏览 3046
已采纳

c语言取小数问题,急求大神解答!

程序是#include
int main()
{
float a,b;
int n;
scanf("%f",&a);
n=(1000*a+0.5);
b=(n*1.0)/1000;
printf("%f",b);
return 0;
}
输入123.4567
输出是123.457001
输入1234.567
输出时1234.567017
输入12345.67
输出是12345.669922
为什么会这样呢?求大神解答!

  • 写回答

2条回答

  • herozhangbz 2016-04-11 10:03
    关注

    你去百度下浮点数的存储格式。机器只能识别0,1,需要二进制转换成十进制。理论上,有限位数的二进制浮点数必能转换为有限位数的十进制数;但对于有限位数的十进制浮点数,转换为二进制数不能保证是有限位数,且多数情况下不是有限位数。因此,如果提供足够的输出位数,二进制浮点数可以精确转换为十进制数,不产生转换误差。但是,由于没有一个2n与lOm(n,m为整数)相等,二进制和十进制相互转换的位数没有简单的若干位对应若干位的对应关系。一般地,二进制浮点数向十进制转换都只提供若干位的近似值,并不提供全部的数字位数。事实上更主要的原因是:计算机中表示的二进制浮点数绝大多数本身就是实际数值的近似值,从有效数字的角度看,转换为十进制数时提供更多位数字并无使用价值。这里自然就有一个如何看待和精确使用数值的问题,即有效数字位数的问题。尤其对于各种数值计算,必须掌握其有效数字位数。但查阅有关资料,没有看到对计算机中浮点数的有效数字位数的准确叙述,一般仅指出fIoat和doubIe型大致的有效数字位数,且说法不一,没有给出依据。在此,从相对误差(误差绝对值与数值绝对值的比值)的角度给出一般性的结论。原文http://wenku.baidu.com/link?url=j8tNlNuV1xovu3jBR_DEdJ3o5amLsDgReUR8wcZhvUr1DT3_3q7qJ1yX7M_ZESRr-tZTMgZLl5sR2Fa-5OONfsCnw_eVVlWmXL-nidrRZju

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料