Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 确定双C+中的十进制位数+;_C++_While Loop_Double_Decimal_Static Cast - Fatal编程技术网

C++ 确定双C+中的十进制位数+;

C++ 确定双C+中的十进制位数+;,c++,while-loop,double,decimal,static-cast,C++,While Loop,Double,Decimal,Static Cast,我试图得到双精度小数点后的位数。目前,我的代码如下所示: int num_of_decimal_digits = 0; while (someDouble - someInt != 0) { someDouble = someDouble*10; someInt = someDouble; num_of_decimal_digits++; } 每当我为小于1的double输入一个十进制,循环就会被卡住并无限重复。我应该使用静态投影吗?有什么建议吗?由于浮点舍入错误,乘以

我试图得到双精度小数点后的位数。目前,我的代码如下所示:

int num_of_decimal_digits = 0;
while (someDouble - someInt != 0)
{
    someDouble = someDouble*10;
    someInt = someDouble;
    num_of_decimal_digits++;
}

每当我为小于1的double输入一个十进制,循环就会被卡住并无限重复。我应该使用静态投影吗?有什么建议吗?

由于浮点舍入错误,乘以10不一定是精确的十进制移位。您可以测试差异的绝对误差,而不是将其与
0
进行精确的相等性比较

while (abs(someDouble - someInt) < epsilon)
while(abs(someDouble-someInt)
或者你可以承认一个尾数为53位的双精度整数只能代表log10 253≈ 15.9位小数,并将循环限制为16次迭代

while (someDouble - someInt != 0 && num_of_decimal_digits < 16)
while(someDouble-someInt!=0&&num(小数位数)<16)
或者两者兼而有之

while (abs(someDouble - someInt) < epsilon && num_of_decimal_digits < 16)
while(abs(someDouble-someInt)
天真的答案是:

int num_of_decimal_digits = 0;
double absDouble = someDouble > 0 ? someDouble : someDouble * -1;
while (absDouble - someInt != 0)
{
    absDouble = absDouble*10;
    someInt = absDouble;
    num_of_decimal_digits++;
}
这就解决了负数的问题


但是,由于浮点数的表示方式,在很多情况下,此解决方案可能无法提供所需的输出。例如,0.35实际上可能表示为0.34999998,这与二进制存储浮点数的方式相同。我建议你分享更多关于你希望用这段代码实现什么的背景信息(你的输入和你想要的输出)。对于您试图实现的目标,可能有更好的解决方案。

对此几乎没有什么有意义的答案。要确定有多少个位置可以是重要的,并相应地进行操作。-除非C++实现的浮点类型是基于十进制表示的(1是不同的整数,这是允许的,但非常罕见)。这个问题没有意义。0.34999998在IEEE 64位二进制浮点中并不完全可表示,这是双精度浮点最常见的选择。与0.35最接近的可表示值为0.349999999999997779553950749686919152736663818359375,如果有任何加强您的观点的话。