游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1337|回复: 1

在C++操作中经常会用到对字符串和各种类型的数字之间的

[复制链接]

1367

主题

1993

帖子

2118

积分

金牌会员

Rank: 6Rank: 6

积分
2118
发表于 2004-11-14 17:16:00 | 显示全部楼层 |阅读模式
   举个例子,比如:

  我要把“123.456”字符串转换成数值正好等于123.456的float 或double 的值,该怎么转化?结果不能是123.4599,123.456001等!

转换方法函数:

CString str = _T("123.456");
DOUBLE dNumber = atof(str);
int iBase = 1;
int i = str.Find(_T("."));
for (int j = 0; j < i ; j ++) iBase* =10;
DOUBLE dTemp1,dTemp2;
dTemp1 = fmod(dNumber,10.0);
dTemp2 = dNumber - dTemp1;
DWORD i = (DWORD)(dTemp1 * iBase + 0.5 );
dTemp2 += i / (1.0 * iBase );

而我们有的时候经常用到的方法:

CString str = _T("123.456");
float fnum = 0;
fnum = atof(str);

是不可以的,因为浮点数本身就不是精确的,如果用数轴来表示浮点数的话,整个数轴上的浮点数是不连续的,所以,并不是每个数值都能有一个浮点数来精确的标示出来。一般来说,越接近原点,浮点数的分布越密集,数值就越精确。



相反:

给你一个 float a = 123.456,怎么将它转换成字符串“123.456”?


方法:

这里将上面的代码稍微修改一下:
首先写一函数:
DOUBLE FormatDouble(DOUBLE dNumber,int iBase)
{
if (iBase <= 0) return dNumber;
DOUBLE dTemp1,dTemp2;
dTemp1 = fmod(dNumber,10.0);
dTemp2 = dNumber - dTemp1;
DWORD i = (DWORD)(dTemp1 * iBase + 0.5 );
dTemp2 += i / (1.0 * iBase );
return dTemp2;
}
原来的转换:
CString str = _T("123.456");
DOUBLE dNumber = atof(str);
int iBase = 1;
int i = str.Find(_T("."));
for (int j = 0; j < str.GetLength() - i ; j ++) iBase* =10;
dNumber = FormatDouble(dNumber,iBase);
后来的转换即在转换成字符串之前也用上述函数整理一下。

14

主题

283

帖子

293

积分

中级会员

Rank: 3Rank: 3

积分
293
QQ
发表于 2004-11-14 23:30:00 | 显示全部楼层

Re:在C++操作中经常会用到对字符串和各种类型的数字之间

最好的办法还是自己实现atof()
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-23 07:19

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表