我需要从用户那里获得一个双打号码。然后,我需要计算小数点后的位数。我有另一个想法,可以将小数部分更改为整数。
例如,如果用户输入234.444,我将使用此方法从该值中分离出0.444使用
double usereneteredvalue=234.444;
int value2=userenteredvalue;
double decimalvalue=userenteredvalue-value2;
但是然后我需要将0.444转换为444,这是我做不到的,因为我不知道十进制后用户输入了多少个值。 谁能给我个主意?
答案 0 :(得分:4)
将用户输入输入字符串,如下所示:
std::string string;
std::cin >> string;
然后
std::istringstream s(string);
int before, after;
char point;
s >> before >> point >> after;
现在after
中有您的电话号码。
编辑: 确定使用更好的解决方案后的位数
int number_of_digits = string.size() - string.find_last_of('.');
“在double
中获取输入”的问题是double
不会(!)在该点之后存储用户定义的位数。
换句话说,实际上您的234.444
可能类似于234.4440000000001
或234.443999999999999
。
答案 1 :(得分:0)
您已经有an awesome C++-esque solution,但是从this comment开始,听起来好像您不喜欢字符串。
如果您真的不想使用字符串,它将非常难看。在大多数情况下*,这将起作用:
//Chop the left side of the decimal off, leaving only the right side
double chop_integer(double d) {
return d - static_cast<int>(d);
}
...
double some_value;
//We don't really care about the integer part, since we're counting decimals,
// so just chop it off to start
some_value = chop_integer(some_value);
int num_after_dec = 0; //initialize counter
//some_value != 0 won't work since it's a double, so check if it's *close* to 0
while(abs(some_value) > 0.000000001) {
num_after_dec++;
//Move decimal right a digit and re-chop the left side
some_value *= 10;
some_value = chop_integer(some_value);
}
std::cout << num_after_dec << std::endl;
*双打只是不能准确存储某些数字,因此诸如.111