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

How can I find the amount of numbers in double?

本文关键字:数字      更新时间:2023-10-16

假设我有一个输入1.251564

我怎样才能找到"."后有多少个元素才能有如下输出:

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

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

感谢您的回答!

让我们考虑一下你的号码,1.251564 .当您将其存储在double中时,它以二进制IEEE754格式存储。您可能会发现该数字无法表示。因此,让我们检查一下这个数字。最接近的可表示双精度值是:

1.25156 39999 99999 89880 45035 73046 53152 82344 81811 52343 75

这可能会让你感到惊讶。小数点后有 52 个十进制数字。

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

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

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

这不会有好结果。问题是有时在以二进制表示数字时会出现浮点错误(这是您的计算机所做的)。例如,当添加 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++;
}

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

如果你有一个小数。假设.1234

反复乘以 10 并扔掉数字的整数部分,直到得到零。步数将是小数位数。例如:

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

但是,当您有一个"浮动"的数字(如 1.1999999999)时,就会出现问题。

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。显然,输出取决于它的实际存储方式。