我想做标题所说的内容:
int number1;
cin>>number1;
num1len=log10(number1)+1;
cout<<"num of digits is "<<num1len<<"\n";
但当位数为11或更多时,答案总是7(6+1)
有谁知道为什么或我做错了什么?
答案 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
变量使用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
时,默认情况下会以科学记数法打印这些大数字,因此您需要在其中添加一些格式。如果您使用的是unsigned long long
,则会在输入时进行打印,但您必须确保您的平台支持unsigned long long
。
unsigned long long
,因此根据您要使用的值,看看是否可供您使用。
答案 3 :(得分:0)
其他人已经指出浮点数是近似值,所以你无法真正得到准确的数字位数。
但是......你可以通过将它写入std :: stringstream对象,然后将其转换为std :: string,并获得所述字符串的长度来获得近似值。你当然必须处理字符串中可能有非数字字符的事实(如减号,小数点,E代表指数等)。您以这种方式获得的位数也取决于您在写入stringstream对象时选择的格式选项。但假设您知道要使用的格式选项,您可以获得受这些选项约束的位数。