본문 바로가기
Programming/Java, Spring

[Java 기초문법] 자바 수학 연산 및 math 관련 함수들, 랜덤함수, 원의 너비 구하기, 구심력 구하기, BigDecimal, Calculting Compound Interest, formattin

by Renechoi 2022. 10. 18.

[Java 기초문법] by Professional Java Developer Career Starter: Java Foundations @ Udemy

 

 

 


Math operations 

 

public class MathStuff {
    public static void main(String[] args) {
        System.out.println(8 * 8 / 8 /4);
    }
}

=> 2 

 

public class MathStuff {
    public static void main(String[] args) {
        System.out.println(7 / 4);
    }
}

=> 1

= fractional parts just thrown up 

 

 

 

public class MathStuff {
    public static void main(String[] args) {
        System.out.println(7f / 4);
    }
}

 

=> 1.75

 

위에서는 int 타입을 default로 인식 

f를 입력함으로써 float type을 determine해줌으로써 

float 결과값이 측정되도록 햊ㅁ 

 

 

또 하나의 방법은 Casting 

괄호를 사용해 telling Java that it now be treated as double 

 

public class MathStuff {
    public static void main(String[] args) {
        System.out.println((double)7 / 4);
    }
}

=> 1.75

 

 

재밌는 점은 이렇게 하면 순서상으로 먼저 int 계산 이후 그다음에 소수점 표현 

public class MathStuff {
    public static void main(String[] args) {
        System.out.println((double)(7 / 4));
    }
}

=> 1.0

 

 

default 값을 먼저 변수 설정에서 해주고 계산할 수도 있다. 

public class MathStuff {
    public static void main(String[] args) {

        int num1 = 7;
        double num2 = 4;

        System.out.println(num1 / num2);

    }
}

=> 1.75 

 

 

 

modulo 

 

public class MathStuff {
    public static void main(String[] args) {
        System.out.println(4 % 2);
    }
}

=> returns remainer =>0 

 

public class MathStuff {
    public static void main(String[] args) {
        int x = 1 ;
        System.out.println(x);
        x = x + 1 ;
        System.out.println(x);
    }
}

return 

1

2

 

 

public class MathStuff {
    public static void main(String[] args) {
        int x = 1 ;
        System.out.println(x);
        x ++ 1 ;    // => x = x+ 1  OR X+=1
        System.out.println(x);
    }
}

return

1

2

 

 

public class MathStuff {
    public static void main(String[] args) {
        int x = 1 ;
        System.out.println(x++);
        System.out.println(x);
    }
}

 

return

1

2

 

 

=> 먼저 x를 출력하고 나서 그 다음에 ++ 연산이 되기 때문에 

 

 

public class MathStuff {
    public static void main(String[] args) {
        int x = 1 ;
        System.out.println(++x);
        System.out.println(x);
    }
}

return

2

2

 

 

 

public class MathStuff {
    public static void main(String[] args) {
        boolean myFlag = true;
        System.out.println(!myFlag);
    }
}

! => Negate the value of what's to be prited 

=> return false 

 

 

 

 


 

Math Functions 

 

 

math 관련 함수들 

 

 

public class MathStuff {
    public static void main(String[] args) {
        System.out.println(Math.abs(-5));


    }
}

=> 5 

 

 

 

public class MathStuff {
    public static void main(String[] args) {
        System.out.println(Math.ceil(5.0));
        System.out.println(Math.ceil(5.1));
        System.out.println(Math.ceil(-5.7));


    }
}

 

5.0
6.0
-5.0

 

 

 

 

 

 

public class MathStuff {
    public static void main(String[] args) {
        System.out.println(Math.floor(5.0));
        System.out.println(Math.floor(5.1));
        System.out.println(Math.floor(-5.7));
    }
}

5.0
5.0
-6.0

 

 

 

public class MathStuff {
    public static void main(String[] args) {
        System.out.println(Math.round(5.0));
        System.out.println(Math.round(5.1));
        System.out.println(Math.round(-5.7));
    }
}

5
5
-6

 

 

 

public class MathStuff {
    public static void main(String[] args) {
        int num1 = 3;
        int num2 = 5;
        System.out.println(Math.min(num1,num2));
    }
}

3

 

 

 

public class MathStuff {
    public static void main(String[] args) {
        int num1 = 2;
        int num2 = 3;
        System.out.println(Math.pow(num1,num2));
    }
}

8.0 

 

 

 

 

랜덤함수 => 일종의 pseidprandom 이다. 

 

 

 

 

 

public class MathStuff {
    public static void main(String[] args) {
        System.out.println(Math.random());
        System.out.println(Math.random());
        System.out.println(Math.random());
        System.out.println(Math.random());
        System.out.println(Math.random());
    }
}

0.890112420340004
0.007477175387426205
0.43299890453355516
0.8008114692293339
0.5393542419758628

 

 

 

public class MathStuff {
    public static void main(String[] args) {
        System.out.println((int)(Math.random() * 10));
        System.out.println((int)(Math.random() * 10));
        System.out.println((int)(Math.random() * 10));
        System.out.println((int)(Math.random() * 10));
        System.out.println((int)(Math.random() * 10));

    }
}


1
7
6
0
7

 

 

루트 계산 

public class MathStuff {
    public static void main(String[] args) {
        System.out.println(Math.sqrt(81));
    }
}


 

9

 

 

 

public class MathStuff {
    public static void main(String[] args) {
        System.out.println(Math.E);
    }
}


 

2.718281828459045

 

 

 


 

More on Random Numbers 

 

 

 

Math 함수에서 random을 구하는 것보다 더 효율적인 것은 Random 모듈을 이용하는 것이다. 

 

 

import java.util.Random;

public class MathStuff {
    public static void main(String[] args) {
        Random random = new Random();
        System.out.println(random.nextInt(10));
        System.out.println(random.nextInt(10));
        System.out.println(random.nextInt(10));
        System.out.println(random.nextInt(10));
        System.out.println(random.nextInt(10));
        System.out.println(random.nextInt(10));
    }
}


 

2
1
4
3
5
9

 

 

바운더리를 정해주는 것으로 쉽게 랜덤 숫자를 구할 수 있다. 

 

이 함수는 seed를 supply를 제공할 수 있는 기능이 있다. 

 

 

 

 

 

그런데 이 함수여도 역시  not very suitable for highly secure things like encryption and things of that sort. 

 

그런 경우라면 사실 

Rather use

 

SecureRandom 

 

import java.security.SecureRandom;
import java.util.Random;

public class MathStuff {
    public static void main(String[] args) {
        SecureRandom random = new SecureRandom();
        System.out.println(random.nextInt(10));
        System.out.println(random.nextInt(10));
        System.out.println(random.nextInt(10));
        System.out.println(random.nextInt(10));
        System.out.println(random.nextInt(10));

    }
}


7
1
1
5
0

 

 

This approach is meant to generate a better, more even distribution of random numbers such that it could be utilized for certain secure functions that you may be implementing. 

 

 


 

 

원의 넓이를 구해보자

 

 

A = PI * r^2

 

 

 

 

 


public class MathStuff {
    public static void main(String[] args) {
        System.out.println(carcAreaOfCircle(3));
    }

    /**
     * This method calculates the area of a circle
     * It uses the formula : Area = PI * radius^2
     * @param radius
     * @return
     */
    public static double carcAreaOfCircle(double radius){
        return Math.PI * Math.pow(radius, 2);
    }
}


 


 

 

 

구심력을 구해보자 (Centripetal Force) 

 

 

 

첫번째 공식 : 

public static double calcPathVelocity(double radius, double period){
    double circumference = 2 * Math.PI * radius;
    return circumference / period;
}

 

두번째 공식 : 

 

public static double calcCentripetalAccel(double pathel, double radius){
    return Math.pow(pathel, 2) / radius;
}

 

 

세번째 공식 :

 

public static double calcCentripetalForce(double mass, double acc){
    return mass * acc;
}

 

 


public class MathStuff {
    public static void main(String[] args) {
        System.out.println(calcAreaOfCircle(3));
        System.out.println(calcPathVelocity(0.8, 3));
        System.out.println(calcCentripetalAccel(1.67, 0.8));
        System.out.println(calcCentripetalForce(0.2,3.504));
    }

    public static double calcAreaOfCircle(double radius){
        return Math.PI * Math.pow(radius, 2);
    }
    public static double calcPathVelocity(double radius, double period){
        double circumference = 2 * Math.PI * radius;
        return circumference / period;
    }
    public static double calcCentripetalAccel(double pathel, double radius){
        return Math.pow(pathel, 2) / radius;
    }
    public static double calcCentripetalForce(double mass, double acc){
        return mass * acc;
    }
}


 

정리 해본다면 ? 

 

 

 

각각의 함수들에 private 처리 

 

종합한 함수를 public으로 새롭게 create 

 

 

 


public class MathStuff {
    public static void main(String[] args) {
        System.out.println(calcCentripetalForce(.2,.8,3));
    }

    private static double calcAreaOfCircle(double radius){
        return Math.PI * Math.pow(radius, 2);
    }
    private static double calcPathVelocity(double radius, double period){
        double circumference = 2 * Math.PI * radius;
        return circumference / period;
    }
    private static double calcCentripetalAccel(double pathVel, double radius){
        return Math.pow(pathVel, 2) / radius;
    }
    private static double calcCentripetalForce(double mass, double acc){
        return mass * acc;
    }

    public static double calcCentripetalForce(double mass, double radius, double period){
        double pathVelocity = calcPathVelocity(radius, period);
        double centripetalAccel = calcCentripetalAccel(pathVelocity, radius);
        double centripetalForce = calcCentripetalForce(mass, centripetalAccel);
        return centripetalForce;
    }
}


 

 

 

 


 

 

Comparing numbers

 

 

 

 

 

public class MathStuff2 {
    public static void main(String[] args) {
        int num1 = 5;
        int num2 = 3;
        System.out.println(num1 == num2);
    }
}

false

 

public class MathStuff2 {
    public static void main(String[] args) {
        int num1 = 5;
        int num2 = 3;
        System.out.println(num1 > num2);
    }
}

 

true

 


 

BigDecimal을 다루는 방법 

 

 

Solution is a class : BigDecimal 

 

 

public class MathStuff2 {
    public static void main(String[] args) {
        float num1 = 2.15f;
        float num2 = 1.10f;
        System.out.println(num1 - num2);
    }
}

1.0500001

 

=> fundamental data types which are not class manupulated 

 

 

BigDecimal 함수에서 string으로 변수를 넣어준다. 

 

 

 

 

 

 

 

하지만 이때 num3과 num4는 primitive한 타입이 아니기 때문에 에러 발생 

 

 

 

import java.math.BigDecimal;

public class MathStuff2 {
    public static void main(String[] args) {
        float num1 = 2.15f;
        float num2 = 1.10f;

        BigDecimal num3 = new BigDecimal("2.15");
        BigDecimal num4 = new BigDecimal("1.10");

        System.out.println(num1 - num2);
        System.out.println(num3.subtract(num4));
    }
}

 

1.0500001
1.05

 

 

 

 

 

import java.math.BigDecimal;

public class MathStuff2 {
    public static void main(String[] args) {
        System.out.println(new BigDecimal(".03828435").divide(new BigDecimal("5.321")));
    }
}

계산할 수 없다는 에러가 나온다. 

 

precision과 Roundingmode를 지정해주기

 

 

import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;

public class MathStuff2 {
    public static void main(String[] args) {
        MathContext mc = new MathContext(5, RoundingMode.HALF_UP);
        System.out.println(new BigDecimal(".03828435").divide(new BigDecimal("5.321"), mc));
    }
}

 

0.0071950

 

 

 

 

import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;

public class MathStuff2 {
    public static void main(String[] args) {
        MathContext mc = new MathContext(7, RoundingMode.HALF_UP);
        System.out.println(new BigDecimal(.054798).sqrt(mc));
    }
}

0.2340897

 

 

 

만약 Bigdecimal을 사용하면서도  str이 아닌 그냥 숫자를 넣는다면 사실상 low level에서 fraction이 근사값으로 들어가기 때문에 의미가 없다 

 

BigDecimal num1 = new BigDecimal(3.141592);

 

 

import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;

public class MathStuff2 {
    public static void main(String[] args) {
        BigDecimal num1 = new BigDecimal("1024");
        System.out.println(num1.doubleValue());
    }
}

1024.0

 

 

 

 


 

 

이자를 계산해보자 Calculting Compound Interest 

 

 

 

 

참고 사이트 : http://moneychimp.com/calculator/compound_interest_calculator.htm

 

Bigdecimal을 이용할 때 string type으로 인풋이 되므로 formula를 string으로 기입하고 시작하자. 

 

 

 

import java.math.BigDecimal;

public class CompounInterestCalc {
    public BigDecimal calculate(String principal, String rate, int period, String contribution){
        
    }
}

 

 

단순히 순서만 놓고 계산을 했을 때 

 

import java.math.BigDecimal;

public class CompoundInterestCalc {
    /**
     * Balance(Y) = P(1 + r)Y    +   C[ ((1 + r)Y - 1) / r ]

     */

    public static void main(String[] args) {
        BigDecimal balance = CompoundInterestCalc.calculate("10000.00", ".08", 10, "1000");
        System.out.println(balance);
    }


    public static BigDecimal calculate(String principal, String rate, int period, String contribution){
        BigDecimal a = BigDecimal.ONE.add(new BigDecimal(rate));    // (1 + r)
        BigDecimal b = a.multiply(new BigDecimal(period));       // (1 + r)Y
        BigDecimal c = b.subtract(BigDecimal.ONE);      // ((1 + r)Y -1)
        BigDecimal d = c.divide(new BigDecimal(rate));      // ((1 + r)Y -1) / r
        BigDecimal e = d.multiply(new BigDecimal(contribution));    // c[((1 + r)Y -1) / r ]

        BigDecimal f = a.multiply(new BigDecimal(principal)).multiply(new BigDecimal(period));

        BigDecimal g = f.add(e);

        return  g;
    }
}

230500.0000

 

 

=> works ! 

 

 

사실 붙여넣기한 formula에서 Y가 multiplied 된 게 아니고 exponent되었던 것이기 때문에 수정이 필요 

 

import java.math.BigDecimal;

public class CompoundInterestCalc {
    /**
     * Balance(Y) = P(1 + r)Y    +   C[ ((1 + r)Y - 1) / r ]

     */

    public static void main(String[] args) {
        BigDecimal balance = CompoundInterestCalc.calculate("10000", ".08", 10, "1000");
        System.out.println(balance);
    }


    public static BigDecimal calculate(String principal, String rate, int period, String contribution){
        BigDecimal a = BigDecimal.ONE.add(new BigDecimal(rate)).pow(period);    // (1 + r)^period
        BigDecimal c = a.subtract(BigDecimal.ONE);      // ((1 + r)Y -1)
        BigDecimal d = c.divide(new BigDecimal(rate));      // ((1 + r)Y -1) / r
        BigDecimal e = d.multiply(new BigDecimal(contribution));    // c[((1 + r)Y -1) / r ]

        BigDecimal f = a.multiply(new BigDecimal(principal)); // (1+r)^period * principal

        BigDecimal g = f.add(e);

        return  g;
    }
}

 

36075.81243863770071040000

 

 

표현되는 숫자 format해주기 

 

간단한 모듈을 사용할 수 있는데 

지역에 따라 해당 지역에 맞는 currency를 반환해준다. 

 

public static void main(String[] args) {
    NumberFormat moneyFormatter = NumberFormat.getCurrencyInstance();
    BigDecimal balance = CompoundInterestCalc.calculate("10000", ".08", 10, "1000");
    System.out.println(moneyFormatter.format(balance));
}

₩36,076

 

변경하기

NumberFormat moneyFormatter = NumberFormat.getCurrencyInstance(Locale.US);

$36,075.81

 

그런데 만약 이 formatter 배치를 좀 더 효율적으로 하려면 ? 

실제 돈을 넣고 계산해보는 것처럼 만들려면 ? 

 

 

 

리팩터 기능에서 field를 선택하고 

 

field declaration으로 선택 후 hit enter 

 

that way we can use this moneyFormatter everywhere in the code 

 

또한 이렇게 함으로써 표현이 맞추어지기 때문에 변수도 조절해주어야 한다. 

 

 

 

 

 

소숫점 자리 표현 해주기 

public static void main(String[] args) throws ParseException {
    DecimalFormat df = new DecimalFormat("#.##");
    BigDecimal balance = CompoundInterestCalc.calculate("$10,000", ".08%", 10, "$1,000");
    System.out.println(df.format(balance));
}

20116.37

 

public static void main(String[] args) throws ParseException {
    DecimalFormat df = new DecimalFormat(",###.##");
    BigDecimal balance = CompoundInterestCalc.calculate("$10,000", ".08%", 10, "$1,000");
    System.out.println(df.format(balance));
}

20,116.37

 

 

 

만약에 마이너스를 표현하고 싶다면 ? 

 

 

public static void main(String[] args) throws ParseException {
    DecimalFormat df = new DecimalFormat("$#,###.##;$(#)");
    BigDecimal balance = CompoundInterestCalc.calculate("$10,000", ".08%", 10, "$1,000");
    System.out.println(df.format(balance.negate()));
}

 

 

$(20,116.37)

 

 

패딩을 주는 방법 

DecimalFormat df = new DecimalFormat("$#,###.00;$(#)");

 

 

퍼센트에 format을 주고 싶다면 

 

public static void main(String[] args) throws ParseException {
    DecimalFormat pf = new DecimalFormat("#%");
    System.out.println(pf.format(0.08));
}

 

 

또하나의 방법은 printf()를 쓰는 것. 

 

System.out.printf("$%,(.2f\n",balance);

 

$20,116.37

 

 


wrapper 

 

 

아래와 같은 형식으로 유저 인풋을 받을 수 있다. 

 

public class wrapper {
    public static void main(String[] args) {
        int age = Integer.parseInt(args[0]);
        System.out.printf("you will be %d years", age + 10);
    }
}

 

Numeric wrapper  를 사용하는 예시 

 

 

public class wrapper {
    public static void main(String[] args) {
        int num1 = 7;
        Integer num1B = Integer.valueOf(num1); // auto-boxing
        Double myDouble = Double.valueOf("2343.12");
        Float myFloat = Float.valueOf("23.23f");
        Byte myByte = Byte.valueOf("23");
        storeDate(num1);
    }

    public static void storeDate(Object obj){}
}

 

These wrapper types are particularly useful when you nee to pass a primitive 

to method that is expecting object or vice versa.

 

storeData 함수는 takes in any of data and stores it somewhere generically 

 

 

 

 

반응형