为什么atof(“91.1”),返回的不是91.1000000000000double型。

lijian22500 2009-08-01 05:24:03
atof返回的是 double型的变量。但是atof(“91.1”),返回的不是91.100000000000000
而是91.099999999999994。而强制转换(float)atof(“91.1”),就是91.1000。

为什么?我用的是vc6.0
...全文
113 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lijian22500 2009-08-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 mu_yang 的回复:]
引用 3 楼 lijian22500 的回复:
回复mu_yang:没明白,为什么atof(“91.1”),返回的不是91.100000000000000 ?


1. 91.0 本来就只能表示成近似的二进制数
所以机器中的(double)91.1不是数学里的91.1
这个机器中的(double)91.1输出时的转换(%f的含义)又进行了一次近似(机器数变成了字符串)
得到了91.099999999999994

2.(float)(double)91.1是对机器中的(double)91.1的又一次近似
(8B的数用4B存储)
(float)(double)91.1输出时进行同上面类似的近似
所以得到什么样的结果都不奇怪(只要不是差太多)

数数上面有多少近似
最重要的是要清楚数学91.1不是机器里的(double)91.1
[/Quote]

明白了,谢了
mu_yang 2009-08-01
  • 打赏
  • 举报
回复
机器中的(double)91.1
数学 91.1
输出(输入)字符序列 91.100000000000000

它们不是一回事情
mu_yang 2009-08-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lijian22500 的回复:]
回复mu_yang:没明白,为什么atof(“91.1”),返回的不是91.100000000000000 ?
[/Quote]

1. 91.0 本来就只能表示成近似的二进制数
所以机器中的(double)91.1不是数学里的91.1
这个机器中的(double)91.1输出时的转换(%f的含义)又进行了一次近似(机器数变成了字符串)
得到了91.099999999999994

2.(float)(double)91.1是对机器中的(double)91.1的又一次近似
(8B的数用4B存储)
(float)(double)91.1输出时进行同上面类似的近似
所以得到什么样的结果都不奇怪(只要不是差太多)

数数上面有多少近似
最重要的是要清楚数学91.1不是机器里的(double)91.1
lijian22500 2009-08-01
  • 打赏
  • 举报
回复
atof 返回 double型 %f是以float显示
lijian22500 2009-08-01
  • 打赏
  • 举报
回复
回复kouwenlong:

printf("%f",atof("91.1")); 这个语句,当atof后,以%f显示,会隐形类型转换的。
lijian22500 2009-08-01
  • 打赏
  • 举报
回复
回复mu_yang:没明白,为什么atof(“91.1”),返回的不是91.100000000000000 ?
kouwenlong 2009-08-01
  • 打赏
  • 举报
回复
没道理啊.
我在我这里试了下.
int main()
{
printf("%f",atof("91.1"));
getchar();
return 0;
}

返回的是91.100000.
mu_yang 2009-08-01
  • 打赏
  • 举报
回复
要是给你5个空格
让你写156789
恐怕你只好写
1.6E5
要是只给你4个空格
你只能写
2.E5

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧