奇怪的乘法误差

时间:2013-04-18 13:34:08

标签: java computer-science

为什么会像这样简单:

System.out.println("test problem: " + 194*194*194*409);

输出如下内容:

test problem: -1308701240

5 个答案:

答案 0 :(得分:11)

因为你已经溢出了一个整数。请参阅java文档中整数处理数字的限制。

答案 1 :(得分:8)

我会建议一些步骤,而不是给你直接答案。

  • 计算你正在做的算术的类型(文字194的类型是什么类型?你使用的乘法运算符的结果是什么类型?)
  • 您希望答案是什么?
  • 您的结果类型可以处理该答案吗?
  • Java为无法处理的结果做了什么?

有关奖励积分,请参阅最后一部分的Java Language Specification ...

答案 2 :(得分:2)

来自15.17.1. Multiplication Operator

  

如果整数乘法溢出,则结果是该位的低位   以一些足够大的二进制补码格式表示的数学乘积。结果,如果发生溢出,则结果的符号可能与两个操作数值的数学乘积的符号不同。

我们有194*194*194*409=2986266056

在二进制中,结果为1011 0001 1111 1110 1100 1101 1100 1000

最后32位是1011 0001 1111 1110 1100 1101 1100 1000,所以我们没有因溢出丢失任何位,但符号已经改变。

由于int表示two's complement,(Source),结果为。{ 2^32 - 2986266056 = -1308701240

一切都按预期工作!

答案 3 :(得分:1)

看起来是操作结果的溢出。 2.986.266.056不是有效的int值。

答案 4 :(得分:-7)

首先尝试制作数学OP,然后将结果转换为字符串。