C++ 我怎样才能找到双倍数字的数量?

C++ 我怎样才能找到双倍数字的数量?,c++,floating-point,double,C++,Floating Point,Double,假设我有一个输入1.251564 如何查找“之后的元素数量,以获得如下输出: int numFloating; // code to go here that leads to // numFloating == 6 p、 很抱歉没有提供任何代码,我只是不知道应该如何实现:( 感谢您的回答!最简单的方法是将其存储在字符串中 std::string str("1.1234"); size_t length = str.length(); size_t found = str.find('.'

假设我有一个输入
1.251564

如何查找
之后的元素数量,以获得如下输出:

int  numFloating;

// code to go here that leads to
// numFloating == 6
p、 很抱歉没有提供任何代码,我只是不知道应该如何实现:(


感谢您的回答!

最简单的方法是将其存储在字符串中

std::string str("1.1234");
size_t length = str.length();
size_t found = str.find('.', 0 );
size_t count = length-found-1;
int finallyGotTheCount = static_cast<int>(count);
std::string str(“1.1234”);
长度=长度();
size_t found=str.find('.',0);
大小\u t计数=长度-found-1;
int finallyGotTheCount=静态施法(计数);

如果你有一个小数,比如说.1234

重复乘以10,然后扔掉整数部分,直到得到零。步数将是小数位数。例如:

.1234 * 10 = 1.234
.234 * 10 = 2.34
.34 * 10 = 3.4
.4 * 10 = 4.0
但是,当您有一个像1.19999999这样的“浮动”数字时,就会出现问题

int  numFloating = 0;

double orgin = 1.251564;

double value = orgin - floor(orgin); 

while(value == 0)
{
   value *= 10;
   value = value - floor(value); 
   numFloating ++;
}
通过使用这段代码,有时答案是错误的。exp:0在浮点中等于(2^31)-1。
显然,输出取决于它的实际存储方式。

这不会很好地结束。问题是,有时在用二进制表示数字时会出现浮点错误(这是您的计算机所做的)。 例如,当添加1/3+1/3+1/3时,您可能会得到0.999999…并且小数位数变化很大

ravi已经提供了一个很好的计算方法,所以我将提供一个不同的方法:

double number = 0; // should be equal to the number you want to check
int  numFloating = 0;
while ((double)(int)number != number){
    number *= 10;
    numFloating++;
}

数字是一个双变量,它包含你要检查的小数位数。

让我们考虑你的号码,<代码> 1.251564代码>代码。当你把它存储在<代码> double < /代码>中时,它以二进制IEEE74格式存储。你可能会发现这个数字是不可表示的。所以,让我们检查这个数字。双是:

1.25156 39999 99999 89880 45035 73046 53152 82344 81811 52343 75
这可能会让你感到惊讶。小数点后有52位小数


你需要从中吸取的教训是,如果你想问关于十进制表示法的问题,你需要使用十进制数据类型,而不是
double
。一旦你能够准确地表示值,那么你就能够以符合你期望的方式对其进行推理。

之后有多少个元素r点在数字1/3中?从数学上讲,在小数点后有一个无穷大的3。我不确定如果乘以10这个数字会有什么反应(例如)显然,你不能存储无穷大。这不是一个简单的问题,因为浮点值的表示和操作是不允许的。让我们考虑双类型——这意味着我们在点之后有最大16个元素。我恢复了编辑。当你有一个新问题要问时,你需要这样问,一个新问题。n、 谢谢你的回答。如果我想把这个数字作为一个整数,我该如何转换它呢?谢谢,这很好地解释了答案。不幸的是,我想避免使用std标准,比如:string:因为我正在跨平台工作,但非常感谢!@mikaeyan最后的评论毫无意义。这个答案中的所有内容都是cross平台。标准库是,嗯,标准库。谢谢,这应该适合我,因为我不需要转换:)谢谢,你能澄清一下“数字”是什么吗?输入?使用
double number=1.251564
,此代码导致
numFloating==0
即使在原则上也不起作用,因为乘以10是不精确的。谢谢,很高兴知道这一点。我想解决的问题是,看看素数形式的双数是否有奇数分母,这是一个很好的链接。我喜欢0.1不是真的0.1:)@Mikaeiberyan那么你为什么不问“我如何确定素数形式的双数是否有奇数分母”@Mikaeiberyan你的根本问题是如何表示你的数据。使用二进制格式是错误的选择。我想自己解决其余的问题,但我现在要更新这个问题。