CString。格式问题

时间:2012-02-20 10:24:29

标签: visual-c++ mfc

我有以下代码信息。

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

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

我不得在csStr中存储trucated值或舍入值。这可能吗?

1 个答案:

答案 0 :(得分:1)

这里有两个问题要处理:

  1. 浮点类型不是任意精度类型,因此您无法在其中存储任何所需的值。某些值将具有精确的浮点表示,而某些值则不会。
  2. 即使您有任意精度类型,也无法存储其(常规)字符串表示形式。我的意思是,如果你计算1.0 / 3.0并希望将其未截断的,未包含的结果存储在一个字符串中,你将需要无限的字符。
  3. 总的来说,你问的是不可能的。

    现在,你要问的值有一个精确的,有限小数位数,十进制表示(但不是所有这些都是精确的FP表示),并且由于采用了舍入CString :: Format,你'如果你做得好的话,很可能会得到存储在csStr中的正确值。

    您的代码存在一些问题(已更正以便编译):

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

    [1]这在db中存储0.0。它将除法计算为整数,得到0,然后将其转换为double。改为double db = 1.0/1e6;(或1.0 / 1000000)。

    [2]您不需要初始化程序。 CStrings初始化为空字符串

    [3]这将在字符串中存储“0.0000010000”。 如果您不想使用尾随零,请将“%lf”写为格式。根据文档,“将值四舍五入为适当的位数”。如果精度足够,您将获得正确的数字,但如果您没有足够的精度(例如,如果您指定精度为6且数字为0.00000001),则可以舍入为0.0,或者尾随为零达到指定的精度。

    那该怎么办?在你的情况下,你说你将有1/100或1/100000000000。如果那是真的(你只能有这两个值),并且它不会改变(这将取决于你正在做什么,但我不相信),你可以存储除数,然后创建字符串在运行中,使用if或其他内容。

    您还可以使用“%g”格式规范。它也进行舍入,但它会删除任何尾随零。警告(或者好处,取决于你正在做的事情)是它可以(并且将)以“1e-6”格式放置一些值。