Java 错误乘法
我试图解决一个涉及基础数学的特殊问题。我的算法适用于所有其他测试用例,因此我知道它是正确的。但是对于其中一个测试用例中的一个特定输入,结果是错误的。我通过打印来检查值,值为:Java 错误乘法,java,math,multiplication,Java,Math,Multiplication,我试图解决一个涉及基础数学的特殊问题。我的算法适用于所有其他测试用例,因此我知道它是正确的。但是对于其中一个测试用例中的一个特定输入,结果是错误的。我通过打印来检查值,值为: a = 1000000000 and b = 999999999 当我这样做的时候 System.out.print(a*b); 它返回1808348672 我尝试过这样做: long ans = (long)a*b; System.out.print(ans); long ans = (long)a*b; Sys
a = 1000000000 and b = 999999999
当我这样做的时候
System.out.print(a*b);
它返回1808348672
我尝试过这样做:
long ans = (long)a*b;
System.out.print(ans);
long ans = (long)a*b;
System.out.print(ans);
它仍然返回1808348672
a
和b
是int
s,因此它们的乘法也将是int
,在通过显式强制转换提升为long
之前溢出
您可以将它们定义为long
s,或者在执行乘法之前将它们分别强制转换为long
s
我尝试过这样做:
long ans = (long)a*b;
System.out.print(ans);
long ans = (long)a*b;
System.out.print(ans);
它仍然返回1808348672
不,它没有:
class Foo {
public static void main(String[] args) {
int a = 1000000000;
int b = 999999999;
long ans = (long)a*b;
System.out.print(ans);
}
}
javacfoo.java&&javafoo
999999999000000000
你可能尝试的是
long ans = (long) (a*b);
这将首先执行整数乘法,然后将结果强制转换为
long
。这不起作用,因为整数乘法在您的强制转换发生之前溢出。这是一个糟糕的重复-它不能回答这个问题。真正的问题是这个问题是不可复制的,因为OP的代码是有效的。@Mureinik请别管它。这里的全部问题是没有相关的。这只是一个不可复制的问题。它通过单独铸造它们来工作。但是为什么我需要单独投下它们呢?我试图强制执行整个操作,但没有成功。@Jaidepkular强制执行结果太晚了-将两个int
相乘将导致int
,在您强制执行之前,该值已经溢出。如果您单独强制转换它们,您将乘以两个long
s,这将产生一个long
,可以容纳结果而不会溢出。我的坏消息。我在ans中使用了int-type,并试图将long存储在int变量中。@jaidepkular,如果没有另一个强制转换,它将无法编译。