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,如果有任何加强您的观点的话。