找到相当于整数的第十个位置

时间:2014-06-11 01:13:30

标签: math floating-point integer floating-point-conversion integer-arithmetic

如何计算和动态地推导出''相当于整数? e.g:

  • 187为0.187
  • 16为0.16
  • 900041 as 0.900041

我理解人们需要计算出确切的位置。我知道一个技巧是将整数变成一个字符串,计算有多少个位置(通过多少个字符),然后创建我们的未来值乘以得到的第十个值 - 就像我们如何会用笔和纸 - 例如:

char integerStr[7] = "186907";
int strLength = strlen(integerStr);
double thsPlace = 0.0F;
for (int counter = 0; counter < strLength; ++counter) {
    thsPlace = 0.1F * thsPlace;
}

但是解决这个问题的非字符串算术方法是什么?

4 个答案:

答案 0 :(得分:4)

伪代码:

n / pow(10, floor(log10(n))+1)

答案 1 :(得分:1)

将原始值重复除以10,直至小于1:

int x = 69105;
double result = (double) x;
while (x > 1.0) x /= 10.0;
/* result = 0.69105 */

请注意,这不适用于负值;对于那些,你需要对绝对值执行算法,然后否定结果。

答案 2 :(得分:1)

[为奇怪的缩进编辑]

我不确定你对你的问题究竟是什么意思,但这就是我要做的事情:

int placeValue(int n)
{
    if (n < 10)
    {
        return 1;
    }
    else
    {
        return placeValue(n / 10) + 1;
    }
}

[这是一种递归方法]

答案 3 :(得分:0)

我不知道pow(10, x)版本的性能如何,但您可以尝试使用整数运算来完成大部分工作。假设我们只处理正值或0(如果需要,使用绝对值):

  int divisor = 1;
  while (divisor < x)
    divisor *= 10; 
  if (divisor > 0)
    return (double)x / divisor; 

注意上面需要一些保护措施,即检查除数是否有溢出(在这种情况下,它会是负数),如果x是正数等等。但我认为你可以自己做。