Умножать длинные значения?
21300 просмотра
5 ответа
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;
!
Ответы (5)
40 плюса
В Java вся математика выполняется в самом большом типе данных, необходимом для обработки всех текущих значений. Итак, если у вас есть int * int, он всегда будет выполнять математику как целое число, а int * long делается как long.
В этом случае 1024 * 1024 * 1024 * 80 делается как Int, который переполняет int.
«L», конечно, заставляет один из операндов быть Int-64 (long), поэтому вся математика выполняется с сохранением значений как Long, таким образом, переполнения не происходит.
Автор: Erich Размещён: 29.09.2009 08:554 плюса
Целочисленные литералы int
s. С 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
.
1 плюс
Я подозреваю, что это потому, что по умолчанию java трактует литералы как целые числа, а не как длинные. Таким образом, без L на 80 умножение переполняется.
Автор: developmentalinsanity Размещён: 29.09.2009 08:551 плюс
Этот код:
long value = 1024 * 1024 * 1024 * 80;
умножает некоторые целые числа вместе, преобразует их в long и затем присваивает результат переменной. Фактическое умножение будет выполняться с помощью javac, а не при его запуске.
Поскольку int 32-битный, значение оборачивается и приводит к нулю.
Как вы говорите, использование длинных значений в правой части даст результат, который переносится, только если он превышает 64 бита.
Автор: Pete Kirkham Размещён: 29.09.2009 08:551 плюс
Если я правильно понял, по вашему требованию, вы хотели бы умножить эти значения 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
}
}
Автор: PAA
Размещён: 24.04.2015 09:22
Вопросы из категории :
- java В чем разница между int и Integer в Java и C #?
- java Как я могу определить IP моего маршрутизатора / шлюза в Java?
- java Каков наилучший способ проверки XML-файла по сравнению с XSD-файлом?
- java Как округлить результат целочисленного деления?
- java Преобразование списка <Integer> в список <String>
- java Почему я не могу объявить статические методы в интерфейсе?
- java Библиотека Java SWIFT
- java Выключение компьютера
- java Как я могу воспроизвести звук на Java?
- java Когда выбирать отмеченные и непроверенные исключения
- type-conversion Преобразовать десятичную в двойную?
- type-conversion Преобразование без знака в C - всегда ли это безопасно?
- type-conversion Как преобразовать числа между шестнадцатеричным и десятичным в C #?
- type-conversion Java: почему я получаю сообщение об ошибке «Несоответствие типов: невозможно преобразовать int в байт»
- type-conversion Создать ArrayList из массива
- type-conversion Как проверить, является ли строка числом (с плавающей запятой)?
- type-conversion Как мне разобрать строку с плавающей точкой или int в Python?
- type-conversion Как я могу преобразовать строку в дату и время с указанием формата в JavaScript?
- type-conversion Преобразовать символьную цифру в соответствующее целое число в C
- type-conversion SQL Server 2008 Преобразование VARCHAR (50) в уникальный идентификатор