You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中判断Dudeney数程序:int与double比较为何无编译错误?

为什么Java中int与Math.cbrt返回的double类型比较不会触发编译错误?

我写了一个判断数字是否为Dudeney数的Java程序,逻辑是获取用户输入的数字,计算其各位数字之和sum(int类型),再比较sum和该数字的立方根(通过Math.cbrt(n)获取,返回double类型)是否相等。但这里int和double直接用==比较,编译器却没有返回错误,这是为什么?

import java.util.Scanner ;
public class dudeney_number
{
    public static void main()
    {
        Scanner sc = new Scanner(System.in) ;
        System.out.print("Enter a number : ") ;
        int n = sc.nextInt() ;
        int temp = n ;
        int sum = 0 ;
        while(temp!=0)
        {
            sum+=temp%10 ;
            temp/=10 ;
        }
        
        if(sum==Math.cbrt(n))
        {
            System.out.println("Dudeney number") ;
        } else {
            System.out.println("Not a dudeney number") ;
        }
    }
}

这是因为Java支持自动拓宽原始类型转换。当你用==比较int和double类型的值时,Java会自动把int类型的sum转换成double类型,再和Math.cbrt(n)返回的double值进行比较。

这种转换属于Java语言规范中定义的安全转换——double类型的取值范围远大于int,而且能精确表示所有int范围内的整数,所以转换过程不会丢失精度,编译器认为这是合法操作,不会抛出错误。

不过要注意:虽然编译没问题,但如果Math.cbrt(n)返回的是一个接近整数的非整数值(比如因为浮点数精度问题),这种直接用==的比较可能会出现逻辑错误。比如对于某些大数,立方根的计算结果可能因为double精度限制,和实际整数有微小偏差,导致本该相等的情况被判断为不等。

内容的提问来源于stack exchange,提问作者Super Coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 09:15:08