如何找到双倍数字?

时间:2014-11-22 10:55:53

标签: c++ floating-point double

假设我有一个输入1.251564

如何在"."之后找到输出的元素数量如下:

int  numFloating;

// code to go here that leads to
// numFloating == 6

P.S。很抱歉没有提供任何代码,我只是不知道应该如何实现:(

感谢您的回答!

5 个答案:

答案 0 :(得分:5)

让我们考虑一下您的电话号码1.251564。将其存储在double中时,它以二进制IEEE754格式存储。你可能会发现这个数字不具代表性。那么,让我们检查这个数字。 closest representable双是:

1.25156 39999 99999 89880 45035 73046 53152 82344 81811 52343 75

这可能会给你带来一些惊喜。小数点后面有52位小数。

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

答案 1 :(得分:2)

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

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);

答案 2 :(得分: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++;
}

number是一个双变量,用于保存要检查小数位的数字。

答案 3 :(得分:0)

如果你有一个小数。让我们说.1234

反复乘以10并丢弃数字的整数部分,直到你得到零。步数将是小数位数。 e.g:

.1234 * 10 = 1.234
.234 * 10 = 2.34
.34 * 10 = 3.4
.4 * 10 = 4.0

如果您的号码是&#34;浮动&#34;像1.199999999。

答案 4 :(得分:0)

int  numFloating = 0;

double orgin = 1.251564;

double value = orgin - floor(orgin); 

while(value == 0)
{
   value *= 10;
   value = value - floor(value); 
   numFloating ++;
}

通过使用此代码,有时候答案是错误的。 exp:浮点零等于(2 ^ 31)-1。 显然,输出取决于它实际存储的方式。