java - long 数据类型中 k 的正幂

标签 java

我必须在 java long 数据类型中打印整数 k 的所有正幂。 我的代码是:

int k = Integer.parseInt(args[0]);
    int i = 1;
    long a = k;
    while (a <= Long.MAX_VALUE) {
        System.out.print(i + " ");
        System.out.println(a);
        i++;
        a = (long) Math.pow(k, i);
      }

当我运行这个程序时,会创建一个无限循环。

但是,当我运行这个程序并进行一些小的更改时:(我刚刚删除了 while 条件中的等于运算符)

int k = Integer.parseInt(args[0]);
    int i = 1;
    long a = k;
    while (a < Long.MAX_VALUE) {
        System.out.print(i + " ");
        System.out.println(a);
        i++;
        a = (long) Math.pow(k, i);
       }

据我所知,经过这个小小的改变后,它工作得很好。 但是,我无法理解这里发生了什么。

最佳答案

问题是在 Math.pow() 调用之后从 double 转换为 longdouble 可以容纳比 long 更大的数字,并且如果您尝试将大的 double 转换为 long ,您将得到 Long.MAX_VALUE。您的第一个循环永远不会退出,因为某个点之后的所有指数都将返回 Long.MAX_VALUE

亲自看看:

public class DoubleToLong {
    public static void main(String[] args) {
        System.out.println((long)Double.MAX_VALUE);
        System.out.println(Long.MAX_VALUE);
    }
}

返回:

9223372036854775807
9223372036854775807

关于java - long 数据类型中 k 的正幂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32465465/

相关文章:

java - Autowiring bean 不工作上下文 :component scan

java - 如何重置 Pane 的不透明度?

java - 一种表示某事已发生的方式

java - 如何编写函数 boolean successes(char a, char b, String s)?使用 s.equals (""), s.charAt(0), s.substring(1)

java - 使用java登录网站?

java - 如何在不立即订阅的情况下调用RxJava Observable?

java - 为什么 hibernate 创建一个没有值的查询?

java - XML 响应消息中的服务器名称?

java - 如何在 snapToTicks==true 时检索最终的 Slider 值?

java - 使用 Jackson 将 JSON 字符串与 Map 合并,无需反序列化字符串