C ++计算double的位数

时间:2010-12-02 18:19:58

标签: c++ double digits

我想做标题所说的内容:

int number1;
cin>>number1;
num1len=log10(number1)+1;
cout<<"num of digits is "<<num1len<<"\n";

但当位数为11或更多时,答案总是7(6+1)

有谁知道为什么或我做错了什么?

4 个答案:

答案 0 :(得分:8)

浮点数据类型(包括double)存储近似值。您通过调用log10找到的是小数点左侧的位置数,受近似过程的影响最多为

你问过的问题,如何找到存储在二进制浮点数中的数字中的小数位数是没有意义的。数字7.1有两位小数,但其近似浮点表示根本不使用十进制数字。要保留十进制数字的数量,您需要一些十进制表示,而不是C ++ double数据类型。

当然,根据问题标题,所有这些仅适用于double。您的代码段实际上并未使用double

答案 1 :(得分:4)

'错误'是可以存储在(带符号)int中的最大值:

#include <iostream>
#include <numeric>

int main()
{
    std::cout << std::numeric_limits<int>::max() << std::endl;
}

给我:

  

2147483647

答案 2 :(得分:2)

你正在超过无符号的32位边界...你的11位数或更多的数字超过了0xFFFFFFFF,所以包裹。

您需要为unsigned long long变量使用doublenumber1

#include <iostream>
#include <cstdlib>
#include <cmath>

int
main ( int argc, char * argv[] )
{
  unsigned long long num; // or double, but note comments below
  std::cin >> num;
  std::cout << "Number of digits in " << num << " is " << ( (int) std::log10 ( num ) + 1 ) << std::endl;
  return 0;
}

如果您选择使用std::cout作为数据类型,那么当您将它们发送到double时,默认情况下会以科学记数法打印这些大数字,因此您需要在其中添加一些格式。如果您使用的是unsigned long long,则会在输入时进行打印,但您必须确保您的平台支持unsigned long long

编辑:正如其他人所提到的,使用浮点值还有其他需要考虑的因素,而且很可能不是你最终想要实现的。 AFAIK是平台上产生最大正值的整数类型unsigned long long,因此根据您要使用的值,看看是否可供您使用。

答案 3 :(得分:0)

其他人已经指出浮点数是近似值,所以你无法真正得到准确的数字位数。

但是......你可以通过将它写入std :: stringstream对象,然后将其转换为std :: string,并获得所述字符串的长度来获得近似值。你当然必须处理字符串中可能有非数字字符的事实(如减号,小数点,E代表指数等)。您以这种方式获得的位数也取决于您在写入stringstream对象时选择的格式选项。但假设您知道要使用的格式选项,您可以获得受这些选项约束的位数。