您的当前位置:我要购书网>在线阅读>VC++/C#/C

double值格式化输出的精度问题解决

来源:互联网  作者:我要购书网信息中心  发布:我要购物网收集整理  发布时间:2006-8-31 人气:139

不知大家碰到过这个问题没有,就是当你用两个double值进行计算后,
当你想将结果输出时,却得不到希望的结果。反正与想象的不一样,
在Windows时提供了API解决此问题:(MFC或标准C++好象都没找到
简单的解决办法)

示例如下:
double d = 5 - 4.99;

d应该是等于0.1吧,跟踪一下程序,发现不是,显示的值是0.0099999999999997868
(不知道VC的调试器是如何显示这个得到的double值的?)

好,我们来开始尝试输出:
1:使用 %f
char szBuff[50];
sprintf(szBuff,"%f",d);
cout<输出:
0.010000 显然不对,加%.2f呢,你咋知道应该是2呢?其它参数呢,不行,因为它是
强制指定精度的。
2:使用 %g
输出:0.01
对了,不过,别急,你再试试 d = 0.123456789
它的输出是 0.1234567,后两位被去掉了。居然连四舍五入都不做。

加参数呢,试试%.15g
输出:哇:0.00999999999999979
这倒是和VC调试器看到的结果有些相似。

怎么办呢?
Windows提供了一个函数,可以处理这个问题:VarFormat

解决方很简单:
void FormatDouble(double dblValue,CString& sOut)
{
_variant_t var(dblValue);
BSTR bstrOut = sOut.AllocSysString();
::VarFormat(&var, L"0.#############", 0, 0, VAR_FORMAT_NOSUBSTITUTE, &bstrOut);
sOut = bstrOut;
::SysFreeString(bstrOut);
}
//当然,你可以不用_variant_t直接用VARIANT,此处用它只是图使用方便。
//#应该用多少个呢,我认为应该13,用14不行,因为后面还可能四舍五入一位上来。

这下就可以用了:
double d = 5 - 4.99;
CString sOut(_T(""));FormatDouble(d,sOut);cout<

相关文章
· dotnet中 “iis 中没有将虚拟目录作为应用程序进..
· dom属性用法速查手册
· dom访问xml-asp.net入门(九)
· doxygen文档之九
· doevents应用
· dotnet总结(1)
· double值格式化输出的精度问题解决
· doxygen文档之六
· dom4j的jaxenexception 论述
· docmd.runsql 语句执行的操作查询如何回滚?
热点文章
%>
· creating user controls
· 提高fastreplace速度 (fstrrep.pas)
· asc ii 完整码表及简介
· 自动生成拼音(汉字反查到拼音)
· sql2000无法安装的解决办法
· 浏览器集成教学 自定义浏览器
· vc++技术内幕(第四版)笔记(第7章)
· mysql5.0中文乱码解决方案
· sql server日期计算
· vc下利用ado连接access数据库
 淘宝旺旺:我要购书网上书店『图书目录
本购书中心地址: 杭州市延安路111号清波商厦南楼D座(总部) 上海市闸北区老沪太路网上购书中心(沪部),  邮编:310002
电子邮件:books@51goushu.com  经营许可证编号:沪ICP备06038574号
版权所有 2003-2008 © All Rights Reserved .购书网