我想做标题这样写的事情:
int number1;
cin>>number1;
num1len=log10(number1)+1;
cout<<"num of digits is "<<num1len<<"\n";
但是当位数为 11 或更多时,答案总是7(6+1)
有谁知道我为什么或我做错了什么?
浮点数据类型,包括double
,存储近似值。您通过调用找到的log10
是小数点左侧的位数,它最多受近似过程的影响。
你问的问题,如何找到存储在二进制浮点数中的十进制位数,是没有意义的。该数字7.1
有两个十进制数字,但它的近似浮点表示根本不使用十进制数字。要保留十进制位数,您需要一些十进制表示,而不是 C++double
数据类型。
当然,所有这些仅适用于double
,根据问题标题。您的代码片段实际上并未使用double
.
“错误”是可以存储在(有符号) int 中的最大值:
#include <iostream>
#include <numeric>
int main()
{
std::cout << std::numeric_limits<int>::max() << std::endl;
}
给我 :
2147483647
您正在超越无符号的 32 位边界……您的 11 位或更多位数超过 0xFFFFFFFF,因此环绕。
您需要使用unsigned long long
或double
为您的number1
变量:
#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
,因此您需要在其中添加一些格式。如果您使用 anunsigned long long
代替,它们将在输入时打印,但您必须确保您的平台支持unsigned long long
.
编辑:正如其他人所提到的,使用浮点值还有其他需要考虑的含义,并且很可能不是您最终想要实现的目标。AFAIK,平台上产生最大正值的整数类型是unsigned long long
,因此根据您要使用的值,查看是否可供您使用。
其他人指出浮点数是近似值,因此您无法真正获得准确的数字计数。
但是...您可以通过将其写入 std::stringstream 对象,然后将其转换为 std::string 并获取所述字符串的长度来获得近似值。您当然必须处理字符串中可能存在非数字字符的事实(如减号、小数点、E 表示指数等)。此外,您以这种方式获得的位数将取决于您在写入 stringstream 对象时选择的格式选项。但是假设您知道要使用哪些格式选项,您可以获得受这些选项影响的位数。