for 循环中的除数值神秘地(?)变化

Posted

技术标签:

【中文标题】for 循环中的除数值神秘地(?)变化【英文标题】:Divisor value in for loop is mysteriously (?) changing 【发布时间】:2019-03-14 02:06:38 【问题描述】:

所以我已经做了几个小时了,老实说,我完全被困住了。我写了一个 for 循环来计算整数中的数字数量,但我发现一旦我输入一个超过 10 位的数字,除数就会发生变化,我不知道为什么。我已经搜索了互联网无济于事,所以如果您有任何帮助或提示,我将不胜感激。谢谢!

 public static int getNumberOfDigits(long creditCardNumber)

    //problem with 0's at beginning and more than 10 digits
    int nDigitsInCard = 0;
    int divisor = (int) creditCardNumber;
    for(int i = 0; i <= creditCardNumber; i++)
        while(divisor!=0)
            divisor/=10;
            ++nDigitsInCard;
        

    // return the number of digits in nDigitsInCard

    return nDigitsInCard;

【问题讨论】:

将 int 更改为 long。您正在处理的数字太大,int 原语无法处理。发生的情况是它再次循环返回(范围从 - 10 到 10)然后放入 11 将循环返回到 -10。 divisor 的初始化中编写(int) 演员表之前,大概有一个编译器警告可能会丢失有效数字。添加演员表会抑制警告,但不能解决根本问题。 【参考方案1】:

ints 不能容纳大于 2,147,483,647 的数字。您需要坚持使用longs 才能处理更大的数字。

【讨论】:

很遗憾,将数据类型改成long后,我的代码还是有同样的问题。 @DarianRay 请使用新代码更新您的问题。 没关系,我已经弄清楚了,我一直在使用错误的变量。不过,长数据类型是其中的一部分。感谢您的帮助!【参考方案2】:

整数最多只能容纳 2 ^ 32 - 1 的数字。另外,为什么要将输入参数转换为整数?

另一件事是,您正在计算导致除数的每个数字中的位数,因为您在 for(int i = 0; i &lt;= creditCardNumber; i++) ... 中从 0 一直循环到 creditCardNumber。因此,例如 10000 将返回 1 中的位数,2 中的位数,一直到 10000。

最后,整个功能可以用一行来完成

return Long.toString(creditCardNumber).length();

return creditCardNumber.toString().length();

如果您将creditCardNumber 更改为Long 而不是long,但您必须在末尾加上l 后缀。

如果你想要更短的东西,你可以这样做

return (creditCardNumber+"").length();

【讨论】:

@ScaryWombat 不错,已修复 嗨!感谢您的输入,我已经修复了所有这些错误。如果可以的话,我会使用 .length 快捷方式,但我的教授明确表示不要,所以我使用了 for 循环。【参考方案3】:

当您的数字大于 10 位时,不会完成到整数的转换,因为整数不能包含大于 2^31 - 1 或 2,147,483,647 的值,这是一个只有 10 位的数字。我建议坚持使用long

【讨论】:

以上是关于for 循环中的除数值神秘地(?)变化的主要内容,如果未能解决你的问题,请参考以下文章

for循环最后一次迭代的指针变化

Actionscript:for..in 循环的输出在 Flash IDE 和浏览器中的显示之间发生变化

for 循环时 key的作用

int 值在 for 循环后自行变化

你好 请教一下 arcgis中的measure工具 我修改了单位名称,但是发现数值没有变化,这是啥原因?

Android “只有创建视图层次结构的原始线程才能接触其视图。” for循环中的错误[重复]