← Назад к вопросам

Какие знаешь методы в числовых классах?

2.0 Middle🔥 111 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Методы в числовых классах Java

Числовые классы (Integer, Long, Double, Float, BigDecimal, BigInteger) предоставляют множество полезных методов для работы с числами, преобразования типов и математических операций.

Integer и Long

// Статические методы Integer
int value = 42;

// Преобразование в строку
String str = Integer.toString(value);     // "42"
String hex = Integer.toHexString(42);     // "2a"
String binary = Integer.toBinaryString(42); // "101010"
String octal = Integer.toOctalString(42);  // "52"

// Преобразование из строки
int fromString = Integer.parseInt("42");    // 42
int fromHex = Integer.parseInt("2a", 16);   // 42 (hex)

// Проверки
int result = Integer.compare(10, 20);       // Возвращает -1
boolean isEven = (value & 1) == 0;

// Информация о типе
int bits = Integer.SIZE;                    // 32
int maxValue = Integer.MAX_VALUE;           // 2147483647
int minValue = Integer.MIN_VALUE;           // -2147483648
int bytes = Integer.BYTES;                  // 4

// Кол-во битов
int bitCount = Integer.bitCount(42);        // 3 (в 101010 три единицы)
int leadingZeros = Integer.numberOfLeadingZeros(42);  // 26
int trailingZeros = Integer.numberOfTrailingZeros(42); // 1

// Операции с битами
int rotate = Integer.rotateLeft(42, 2);    // Rotate левый сдвиг
int reverse = Integer.reverse(42);          // Разворот битов

// Высший установленный бит
int highBit = Integer.highestOneBit(42);   // 32 (0010_0000)
int lowBit = Integer.lowestOneBit(42);     // 2 (0000_0010)

// Long аналогичен Integer
long value64 = 1234567890L;
long bitCount64 = Long.bitCount(value64);
String hex64 = Long.toHexString(value64);

Float и Double

// Статические методы
double value = 3.14159;

// Проверки специальных значений
boolean isNaN = Double.isNaN(Double.NaN);       // true
boolean isInf = Double.isInfinite(1.0 / 0.0);   // true (Infinity)
boolean isFinite = Double.isFinite(3.14);       // true

// Преобразование
String str = Double.toString(3.14);             // "3.14"
String scientific = Double.toString(1e-10);     // "1.0E-10"

// Сравнение с precision
int compare = Double.compare(3.14, 3.14);       // 0 (равны)
int compareOrdered = Double.compare(Double.NaN, 3.14); // 1 (NaN считается больше)

// Граничные значения
double maxValue = Double.MAX_VALUE;             // ~1.8e308
double minValue = Double.MIN_VALUE;             // ~4.9e-324
double minPositive = Double.MIN_NORMAL;         // ~2.2e-308

// Преобразование битов (для сравнения двух doubles)
long bits1 = Double.doubleToLongBits(3.14);
long bits2 = Double.doubleToLongBits(3.14);
boolean same = bits1 == bits2; // Точное сравнение

double reconstructed = Double.longBitsToDouble(bits1);

Number (базовый класс)

public class NumberMethods {
    public void demonstrate() {
        // Все числовые классы наследуют Number
        Number num = 42; // Integer
        
        // Методы Number
        byte b = num.byteValue();     // 42
        short s = num.shortValue();   // 42
        int i = num.intValue();       // 42
        long l = num.longValue();     // 42L
        float f = num.floatValue();   // 42.0f
        double d = num.doubleValue(); // 42.0
    }
}

BigDecimal (для денег и точных расчетов!)

// НИКОГДА не используй double для денег!
public class MoneyCalculation {
    public static void main(String[] args) {
        // ❌ Плохо: double
        double price = 0.1 + 0.2;
        System.out.println(price); // 0.30000000000000004 (ошибка!)
        
        // ✅ Хорошо: BigDecimal
        BigDecimal price1 = new BigDecimal("0.1");
        BigDecimal price2 = new BigDecimal("0.2");
        BigDecimal sum = price1.add(price2);
        System.out.println(sum); // 0.3
    }
}

// Методы BigDecimal
public class BigDecimalMethods {
    public void demonstrate() {
        BigDecimal amount = new BigDecimal("100.50");
        
        // Арифметика
        BigDecimal added = amount.add(new BigDecimal("10"));    // 110.50
        BigDecimal subtracted = amount.subtract(new BigDecimal("10")); // 90.50
        BigDecimal multiplied = amount.multiply(new BigDecimal("2"));  // 201.00
        BigDecimal divided = amount.divide(new BigDecimal("2"));       // 50.25
        BigDecimal remainder = amount.remainder(new BigDecimal("3")); // 1.50
        BigDecimal power = amount.pow(2);                       // 10100.25
        
        // Модификации
        BigDecimal abs = amount.abs();                          // 100.50
        BigDecimal negated = amount.negate();                   // -100.50
        
        // Сравнение (ВАЖНО!)
        int cmp = amount.compareTo(new BigDecimal("100.50"));   // 0
        // equals НЕ работает для BigDecimal с разными масштабами!
        BigDecimal a = new BigDecimal("10.0");
        BigDecimal b = new BigDecimal("10.00");
        a.equals(b);            // false (разные масштабы!)
        a.compareTo(b) == 0;    // true (значения равны)
        
        // Округление (масштабирование)
        BigDecimal rounded = amount.setScale(0, RoundingMode.HALF_UP);
        // setScale(digit count, rounding mode)
        // RoundingMode: HALF_UP, DOWN, UP, CEILING, FLOOR и т.д.
        
        // Преобразование
        String str = amount.toString();          // "100.50"
        String plain = amount.toPlainString();   // "100.50" (без scientific notation)
        double d = amount.doubleValue();         // 100.50
        int i = amount.intValue();               // 100
        long l = amount.longValue();             // 100
        
        // Степени
        BigDecimal ten = new BigDecimal("10");
        int scale = amount.scale();              // 2 (количество decimal places)
        
        // Минус значение
        boolean isNegative = amount.signum() < 0; // false
        // signum(): -1 если < 0, 0 если = 0, 1 если > 0
    }
}

// Best practice для денег
@Entity
public class Transaction {
    @Id
    private Long id;
    
    // ВСЕГДА используй BigDecimal для денег!
    @Column(precision = 19, scale = 4)
    private BigDecimal amount;
    
    private static final BigDecimal MINIMUM_AMOUNT = new BigDecimal("0.01");
    
    public void setAmount(BigDecimal amount) {
        if (amount.compareTo(MINIMUM_AMOUNT) < 0) {
            throw new IllegalArgumentException("Amount too small");
        }
        // Всегда нормализуй
        this.amount = amount.setScale(4, RoundingMode.HALF_UP);
    }
}

BigInteger (для больших целых чисел)

public class BigIntegerMethods {
    public void demonstrate() {
        BigInteger big = new BigInteger("999999999999999999999");
        
        // Арифметика (все операции не изменяют исходное значение)
        BigInteger added = big.add(BigInteger.ONE);
        BigInteger multiplied = big.multiply(new BigInteger("2"));
        BigInteger divided = big.divide(new BigInteger("3"));
        
        // Модульная арифметика (для криптографии)
        BigInteger modResult = big.mod(new BigInteger("1000"));     // Остаток
        BigInteger modPower = big.modPow(new BigInteger("2"), new BigInteger("1000"));
        // Вычисляет (big^2) mod 1000 эффективно
        
        // Инверсия (для криптографии)
        BigInteger inverse = big.modInverse(new BigInteger("997")); // big^-1 mod 997
        
        // GCD и LCM
        BigInteger gcd = big.gcd(new BigInteger("1000")); // Наибольший общий делитель
        
        // Проверка простоты
        boolean isProbablyPrime = new BigInteger("997").isProbablePrime(40);
        // 40 = уровень confidence
        
        // Битовые операции
        int bitLength = big.bitLength();            // Количество бит
        BigInteger shiftLeft = big.shiftLeft(2);   // big << 2
        BigInteger shiftRight = big.shiftRight(2); // big >> 2
        BigInteger andResult = big.and(new BigInteger("255"));
        BigInteger orResult = big.or(new BigInteger("255"));
        BigInteger xorResult = big.xor(new BigInteger("255"));
        BigInteger flipBits = big.flipBit(0);      // XOR с 2^0
        
        // Факториал (пример использования)
        BigInteger factorial = factorial(100);
    }
    
    public BigInteger factorial(int n) {
        BigInteger result = BigInteger.ONE;
        for (int i = 2; i <= n; i++) {
            result = result.multiply(BigInteger.valueOf(i));
        }
        return result;
    }
}

Math класс (утилиты)

public class MathMethods {
    public static void main(String[] args) {
        // Базовые операции
        Math.abs(-5);              // 5
        Math.max(10, 20);          // 20
        Math.min(10, 20);          // 10
        
        // Округление
        Math.round(3.6);           // 4 (long)
        Math.floor(3.6);           // 3.0
        Math.ceil(3.2);            // 4.0
        
        // Степени и корни
        Math.pow(2, 8);            // 256.0
        Math.sqrt(16);             // 4.0
        Math.cbrt(27);             // 3.0 (кубический корень)
        
        // Тригонометрия
        Math.sin(Math.PI / 2);     // 1.0
        Math.cos(0);               // 1.0
        Math.tan(Math.PI / 4);     // 1.0
        Math.asin(1);              // π/2
        
        // Логарифмы
        Math.log(Math.E);          // 1.0
        Math.log10(100);           // 2.0
        Math.log1p(1.0);           // ln(2)
        Math.exp(1);               // e
        
        // Угловые единицы
        Math.toRadians(180);       // π
        Math.toDegrees(Math.PI);   // 180
        
        // Константы
        double pi = Math.PI;       // 3.14159...
        double e = Math.E;        // 2.71828...
    }
}

Сравнение точности

// Для потребительских приложений
public class DecimalComparison {
    
    // ❌ Неправильно
    public boolean compare(double a, double b) {
        return a == b; // Опасно для floating point
    }
    
    // ✅ Правильно
    public boolean compare(double a, double b) {
        double epsilon = 1e-10;
        return Math.abs(a - b) < epsilon;
    }
    
    // ✅ Для денег - BigDecimal
    public void transactionAmount() {
        BigDecimal price = new BigDecimal("9.99");
        BigDecimal tax = new BigDecimal("0.10");
        BigDecimal total = price.add(tax);
    }
}

Правильный выбор числового типа критичен для надежности приложения, особенно для финансовых операций и точных расчетов.

Какие знаешь методы в числовых классах? | PrepBro