rudolf
驱动小牛
驱动小牛
  • 注册日期2002-10-09
  • 最后登录2006-04-25
  • 粉丝0
  • 关注0
  • 积分81分
  • 威望9点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
阅读:1506回复:10

奇怪的C类型转换问题:

楼主#
更多 发布于:2002-11-21 09:18
目的:将字符串“163.45”转换成16345。
代码如下:
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>

void main()
{

char *cha=\"163.45\";
double x1;
long int num;

x1=atof(cha);
x1=x1*100;
num=x1;
printf(\"cha:%s x1:%f num:%d\",cha,x1,num);
printf(\"\\n Press any key return\");
getch();
}

在BC31下调试通过。(OS:win98se2,win2k p)
num的值竟然不是16345,而是16344。为什么?!
将字符串换成其他的暂未发现同样的问题。
请大家帮忙测试一下,看看问题在哪。
靠天靠地靠父母,不如靠自己。
ydyuse
驱动老牛
驱动老牛
  • 注册日期2002-07-25
  • 最后登录2005-03-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-21 09:55
build warning:
conversion from \'double\' to \'float\', possible loss of data

我的修改:
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>

void main()
{

char *cha=\"163.45\";
//double x1;
float x1;

float num1;
unsigned long  num;

x1=atof(cha);
x1=x1*100;
num1=x1;
num =num1;
printf(\"cha:%s x1:%f num:%d\",cha,x1,num);
printf(\"\\n Press any key return\");
getch();
}

给分喔!!!

生命驱动,活力无限!
ydyuse
驱动老牛
驱动老牛
  • 注册日期2002-07-25
  • 最后登录2005-03-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-21 09:57
我在VC CONSOL APP中得到了16345。
生命驱动,活力无限!
Buddha
驱动老牛
驱动老牛
  • 注册日期2001-04-29
  • 最后登录2013-05-18
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望17点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-11-21 10:00
用sscanf(ch, \"%f\", &x1);
<table style="filter: glow(color=sky blue, strength=10)"> <font color=white> 猫生病了, 老鼠大声朗诵诗集, 并修剪盆花. 猫生病了, 老鼠慢慢刷牙洗脸, 并打扫房间. 猫生病了, 老鼠倚在窗边欣赏夜色, 并对流星许愿. 猫生病了, 老鼠也病了, 它说:"我还是习惯那种时时紧张, 处处小心, 夜夜逃亡的生活." 午夜, 我听到老鼠在叹息, 且不再读诗了. </font></table>
OneWind
驱动小牛
驱动小牛
  • 注册日期2002-05-15
  • 最后登录2009-04-10
  • 粉丝0
  • 关注0
  • 积分82分
  • 威望11点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-11-21 10:03
long    为32位
double  为64位
把你的  long类型的num改为double类型再适一下
嘿,大家好!
rudolf
驱动小牛
驱动小牛
  • 注册日期2002-10-09
  • 最后登录2006-04-25
  • 粉丝0
  • 关注0
  • 积分81分
  • 威望9点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-11-21 12:14
我只是奇怪,为什么在其他的数据没有问题呢?

如果改变了数据类型就太麻烦了。

我现在是这样处理的:
把x1=x1*100;
改成:
x1=x1*10;
x1=x1*10;
就好了。
太讨厌了。
 :( :( :( :( :(
靠天靠地靠父母,不如靠自己。
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2002-11-21 15:57
char cha[]=\"163.45\";
cn18799
驱动老牛
驱动老牛
  • 注册日期2001-11-17
  • 最后登录2010-04-16
  • 粉丝0
  • 关注0
  • 积分54分
  • 威望36点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-11-22 08:33
num=x1  //舍弃小数部分(总会有某些数有问题,如16344.9 --> 16344)

num=x1+0.5  //四舍五入(应该没问题了)
[img]http://www.danasoft.com/vipersig.jpg[/img] [img]http://www.driverdevelop.com/forum/upload/cn18799/2002-09-28_logo.gif[/img]
cn18799
驱动老牛
驱动老牛
  • 注册日期2001-11-17
  • 最后登录2010-04-16
  • 粉丝0
  • 关注0
  • 积分54分
  • 威望36点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-11-22 08:35
以上是因为浮点数不是“精确”的。
[img]http://www.danasoft.com/vipersig.jpg[/img] [img]http://www.driverdevelop.com/forum/upload/cn18799/2002-09-28_logo.gif[/img]
rudolf
驱动小牛
驱动小牛
  • 注册日期2002-10-09
  • 最后登录2006-04-25
  • 粉丝0
  • 关注0
  • 积分81分
  • 威望9点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-11-22 10:45
char cha[]=\"163.45\";


老大,这样是啃腚不行的。
呵呵。
 :D :D :D
靠天靠地靠父母,不如靠自己。
xeonjohn
驱动牛犊
驱动牛犊
  • 注册日期2001-07-25
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
10楼#
发布于:2002-11-22 17:21
num =num1;
改为:
num =num1+0.5;
一切OK。
请参考我在xici C++Builder论坛发表的贴子
我思故我在
游客

返回顶部