2012-02-20 50 views
0

我有下面的代码snipppet。CString。格式问题

double db = 1/1000000; 
CString csStr(""; 
csStr.Format('%.10f',ct); 

基本上的db值为0.000001
我需要将此值存储为csStr
MFC VC++中的格式语句是否正确?
另外,db可以是1/1001/100000000000

我不能在csStr中存储trucated值或四舍五入的值。那可能吗?

回答

1

你有两个问题需要解决这里:

  1. 浮点类型不是任意精度的类型,所以你不能保存您在他们想要的任何值。有些值会有精确的浮点表示,有些则不会。
  2. 即使您有任意的精度类型,也不能存储其(通用)字符串表示。我的意思是,如果你计算1.0/3.0并且希望将其未截断的,未被包围的结果存储在一个字符串中,你将需要无限的字符。

所以你问的是不可能的,一般来说。

现在,您所询问的值有一个精确的有限小数位数,十进制表示形式(但并非所有这些都是精确的FP表示形式),并且感谢CString :: Format舍入函数,您如果你做得很好,最有可能得到存储在csStr中的正确值。

您的代码具有一定的问题(校正,使得它编译):

double db = 1/1000000; // [1] 
CString csStr("");   // [2] 
csStr.Format("%.10f", db); // [3] 

[1]这存储在分贝0.0。它将整除计算为0,然后将其转换为双精度。代替double db = 1.0/1e6;(或1.0/1000000)。

[2]你不需要初始值设定项。 CString被初始化为空字符串

[3]这会在字符串中存储“0.0000010000”。 如果您不想要尾随零,请将“%lf”写为格式。 根据文档,“该值四舍五入到合适的位数”。如果精度足够了,你会得到正确的数字,但是如果你没有足够的精度(例如,如果你指定精度为6,数字为0.00000001),或者有零结尾达到指定的精度。

那该怎么办?就你而言,你说你会有1/100或1/100000000000。如果这是真的(你只能拥有这两个值),并且它不会改变(这将取决于你在做什么,但我不会相信这一点),你可以存储除数,然后创建字符串在飞行中,与if什么的。

您也可以使用“%g”格式规范。它也完成四舍五入,但它删除任何尾随的零。警告(或好东西,取决于你在做什么)是它可以(并且将)以“1e-6”格式放置一些值。