如何计算c ++中双变量的小数位?

时间:2014-03-27 22:02:27

标签: c++ floating-point double decimal

对于我大学的课程,我需要编写一个将数字转换成的程序 自然语言如果用户输入" 2.55"程序输出"两点五五"。 我接近完成它,我唯一得到的是数字之后的数字。 我不允许使用字符串。这是我试图得到小数位数的方法:

i=0;
while((wert - (long int)wert) != 0){
    wert /= 10;
    i++;
}

但它给出了示例数字" 2.55"的356位小数值。是否有任何方法没有使用字符串来计算小数位?

最好的问候

5 个答案:

答案 0 :(得分:2)

由于浮点精度,您将无法使用double来执行此操作。例如,设置为0.2的double将具有比1更多的小数位,因为0.2无法精确表示。 (为什么不检查调试器中double的实际值?)2.55也无法精确表示。

这里最简单的事情可能是使用一个字符串来表示你的数字并将你的解析器作为基础。

答案 1 :(得分:2)

如果用户输入了数字,它将以字符串形式出现,或者我们应该将其写入字节数组,因此根本不需要将浮点数输入其中。只需在数据中找到小数位,然后开始计算数字。

注意:标题中的问题毫无意义。浮点变量没有小数位,它们有二进制位,十进制和二进制位是不可通约的。如果您的教授希望您使用浮点数,他自己需要re-education

答案 2 :(得分:1)

最接近2.55的IEEE 64位二进制数是2.54999999999999982236431605997495353221893310546875,小数点后只有50位数。

重复分裂毫无意义。忽略舍入误差,wert的值将为2.55,0.255,0.0255,0.00255等,其中任何一个都不等于任何长度。当wert下溢为零时,循环终止。

相反,你应该乘以10.但是,如果你保持前导数字,你可能会得到一个数字太大,无法在获得相等之前存储很长时间。相反,我建议在每一步减去整数部分,并在结果为零时停止。

这仍然会导致50位小数的答案,但如果你的教授坚持加倍,也许这就是你想要的。

答案 3 :(得分:1)

char* fractpart(double f)
{
char chrstr[5];
char charary={'1','2','3',....,'0'};
int intary={1,2,3,...,0};
int count=0,x,y;
f=f-(int)f;
        while(f<=1)
        {
         f=f*10;
           for(y=0;y<10;y++)
           {
               if((int)f==intary[y])
               { 
               chrstr[count]=charary[y];
               break;
               }
           }
   f=f-(int)f;
      if(f<=0.01 || count==4)
      break;
      if(f<0)
      f=-f;
      count++;
}
     return(chrstr);
}

答案 4 :(得分:0)

你必须知道点后必须支持的最大位数。让我们说n位数最多。将数字的小数部分乘以10^n,然后将结果数字向右移动,直到最后一个数字与0不同,以删除尾随零。然后逐个打印数字:

void printDigitsAfterPoint(double x) {
    int k = Math.round((x-(int) x)*Math.pow10(n));
    // remove trailing zeroes
    while (k!=0 && k%10==0) {
        k/=10;
    }
    // output digits
    while (k!=0) {
        output(k%10); // you already should have a method like this...
        k/=10;
    }
}

确保添加用于处理x的负值的代码。我相信你的教授会尝试......

编辑:忘记更改声明。固定的。