Умножать длинные значения?

java type-conversion

21300 просмотра

5 ответа

731 Репутация автора

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;!

Автор: Jonhnny Weslley Источник Размещён: 29.09.2009 08:50

Ответы (5)


4 плюса

130855 Репутация автора

Целочисленные литералы ints. С 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.

Автор: Tom Hawtin - tackline Размещён: 29.09.2009 08:54

40 плюса

3654 Репутация автора

Решение

В Java вся математика выполняется в самом большом типе данных, необходимом для обработки всех текущих значений. Итак, если у вас есть int * int, он всегда будет выполнять математику как целое число, а int * long делается как long.

В этом случае 1024 * 1024 * 1024 * 80 делается как Int, который переполняет int.

«L», конечно, заставляет один из операндов быть Int-64 (long), поэтому вся математика выполняется с сохранением значений как Long, таким образом, переполнения не происходит.

Автор: Erich Размещён: 29.09.2009 08:55

1 плюс

5363 Репутация автора

Я подозреваю, что это потому, что по умолчанию java трактует литералы как целые числа, а не как длинные. Таким образом, без L на 80 умножение переполняется.

Автор: developmentalinsanity Размещён: 29.09.2009 08:55

1 плюс

44140 Репутация автора

Этот код:

long value = 1024 * 1024 * 1024 * 80; 

умножает некоторые целые числа вместе, преобразует их в long и затем присваивает результат переменной. Фактическое умножение будет выполняться с помощью javac, а не при его запуске.

Поскольку int 32-битный, значение оборачивается и приводит к нулю.

Как вы говорите, использование длинных значений в правой части даст результат, который переносится, только если он превышает 64 бита.

Автор: Pete Kirkham Размещён: 29.09.2009 08:55

1 плюс

3477 Репутация автора

Если я правильно понял, по вашему требованию, вы хотели бы умножить эти значения 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
Вопросы из категории :
32x32