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
相关产品推荐
相关产品推荐

