如何在c++中计算双变量的小数点

floating point - How to count the decimal places of an double variable in c++?

本文关键字:变量 小数点 计算 c++      更新时间:2023-10-16

在我大学的一门课程中,我需要写一个程序将一个数字转换成自然语言,例如,如果用户输入"2.55",程序输出"2.55"。我快要完成了,唯一不能得到的是点之后的数字。不允许使用字符串。下面是我如何获取小数位数的计数:

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

但是它给我的值是小数点后356位的例子数字"2.55"。有没有不使用字符串来计数小数点的方法?

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

对你来说最简单的事情可能就是用一个字符串来表示你的数字,并以此作为解析器的基础。

如果用户输入的是数字,它将以字符串形式输入,或者应该说是字节数组,因此根本不需要将浮点数带入其中。只要找到数据中的小数点,然后开始计数。

注:你标题里的问题没有意义。浮点变量没有小数位,它们有二进制位,而小数和二进制位是不可通约的。如果你的教授想让你使用浮点数,他自己需要重新教育。

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

重复除法没有意义。忽略舍入误差,wert的值为2.55、0.255、0.0255、0.00255等,它们都不等于任何一个长。当wert下溢为零时,循环终止。

应该乘以10。然而,如果你保留前导数字,你可能会得到一个太大的数字,在得到相等之前不能作为长存储。相反,我建议每一步减去整数部分,并在结果为零时停止。

这仍然会得到小数点后50位的答案,但如果你的教授坚持要用双位数,也许这就是你想要的。

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);
}

您必须知道在该点之后必须支持的最大位数。我们设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负值的代码。我相信你的教授会尝试……

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