我怎样才能找到双倍的数字数量
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。显然,输出取决于它的实际存储方式。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 检查输入是否不是整数或数字
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 如何用数字处理log(0)
- 最高有效数字侧的第N位
- 如何获取一个数字的前3位
- 查找最接近的大于当前数字的数字的索引
- 找到两对数字,使它们的乘积的绝对差最小化
- 我想做一个彼此不同但重复出现的数字
- 将数字转换为字母(例如:123 转换为一二三)
- C++如何计算用户输入的数字中的偶数位数
- 如何在C++中确定文本文件中的元素是字符还是数字
- 打印数字图案
- C++问题:用户认为数字1-100,程序提出问题不超过6次即可得到答案。无法正确
- 如何检查一个c++字符串中有多少相同的字符/数字
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 将数字打印成文字
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 在将数字随机生成为数组期间从内存输出随机数的数组