乘以长值?
class Main { public static void main (String[] args){ long value = 1024 * 1024 * 1024 * 80; System.out.println(Long.MAX_VALUE); System.out.println(value); } }
输出是:
9223372036854775807 0
如果long value = 1024 * 1024 * 1024 * 80L;
这是正确的long value = 1024 * 1024 * 1024 * 80L;
!
在Java中,所有数学都是以处理所有当前值所需的最大数据类型完成的。 因此,如果你有int * int,它将始终将数学作为整数,但int * long作为long来完成。
在这种情况下,1024 * 1024 * 1024 * 80作为Int溢出,溢出int。
“L”当然强制其中一个操作数为Int-64(long),因此所有数学运算都将值存储为Long,因此不会发生溢出。
整数文字是int
。 int
溢出。 使用L
后缀。
long value = 1024L * 1024L * 1024L * 80L;
如果数据来自变量,则预先投射或分配给long。
long value = (long)a * (long)b; long aL = a; long bL = b; long value = aL*bL
严格来说,你可以减少足够的时间,但最好还是明确一点。
也不是作为后缀的小写字母l
可以混淆为1
。
我怀疑这是因为默认情况下,java将文字视为整数,而不是长整数。 因此,如果没有L on 80,则乘法溢出。
这段代码:
long value = 1024 * 1024 * 1024 * 80;
将一些整数相乘,将其转换为long,然后将结果赋值给变量。 实际的乘法将由javac而不是在运行时完成。
由于int是32位,因此值被包装并导致零。
正如您所说,在右侧使用长值将产生一个结果,如果它超过64位则只包装。
如果我理解正确,根据您的要求,您希望将这些值乘以1024 * 1024 * 1024 * 80;
在计算器中,我看到值为1024 * 1024 * 1024 * 80 = 85899345920。
在这里你得到你的java代码:这些是java中的货币价值计算
import java.math.BigDecimal; public class Demo { public static void main(String[] args) { BigDecimal bd1 = new BigDecimal("1024"); BigDecimal bd2 = new BigDecimal("1024"); BigDecimal bd3 = new BigDecimal("1024"); BigDecimal bd4 = new BigDecimal("80"); BigDecimal bd5 = bd1.multiply(bd2).multiply(bd3).multiply(bd4); System.out.println(bd5); // output comes: 85899345920 } }