0
0

More than 3 years have passed since last update.

【Java】数学演算のまとめ

Posted at

数学演算

基本演算

  • Mathクラス
    • 全機能がクラスメソッド化されている
    • Mathクラスのインスタンス化は不要(できない)
public class Main {
  public static void main(String[] args) {
    //絶対値,最大,最小
    System.out.println(Math.abs(-100)); //100
    System.out.println(Math.max(6, 3)); //6
    System.out.println(Math.min(6, 3)); //3
    //切り上げ
    System.out.println(Math.ceil(1234.56));  //1235.0
    //切り捨て
    System.out.println(Math.floor(1234.56)); //1234.0
    //四捨五入
    System.out.println(Math.round(1234.56)); //1235
    //平方根
    System.out.println(Math.sqrt(10000));    //100.0
    //立方根
    System.out.println(Math.cbrt(10000));    //21.544346900318835
    //xのy乗
    System.out.println(Math.pow(2, 4));      //16.0
    //角度をradianに変換
    System.out.println(Math.sin(Math.toRadians(30))); //0.49999999999999994
    System.out.println(Math.cos(Math.toRadians(60))); //0.5000000000000001
    System.out.println(Math.tan(Math.toRadians(45))); //0.9999999999999999
    //底eの対数、底10の対数
    System.out.println(Math.log(100));                //4.605170185988092
    System.out.println(Math.log10(100));              //2.0
  }
}

long型以上の整数演算

  • BigIntegerクラス
    • long値を超えた値が正しく出力
    • cf:BigDecimalクラスでは広範囲浮動小数点数を正しく演算
//NG例 long型上限を超えたところからオーバーフロー
public class Main {
  public static void main(String[] args) {
    long result = 1;
    for (var i = 1; i < 26; i++) {
      result *= i;
      System.out.println(result);
      //1,2,,,(略),2432902008176640000,-4249290049419214848,-1250660718674968576,8128291617894825984,-7835185981329244160,7034535277573963776
    }
  }
}
//OK演算
import java.math.BigInteger;
public class Main {
  public static void main(String[] args) {
    var result = BigInteger.valueOf(1);
    for (var i = 1; i < 26; i++) {
      result = result.multiply(BigInteger.valueOf(i));
      System.out.println(result);
      //1,2,6,,,(略),,2432902008176640000,51090942171709440000,1124000727777607680000,25852016738884976640000,620448401733239439360000,15511210043330985984000000
    }
  }
}

乱数生成

  • Randomクラス
import java.util.Random;

public class Main {
  public static void main(String[] args) {
    var rnd = new Random();
    //ブール値でで乱数生成
    System.out.println(rnd.nextBoolean()); //true
    //Floatで乱数生成(0~1)
    System.out.println(rnd.nextFloat());   //0.11219084
    //Doubleで乱数生成(0~1)
    System.out.println(rnd.nextDouble());  //0.983418224742081
    //Intで乱数生成(0~bound)
    System.out.println(rnd.nextInt(400) + 100); //448
    //Longで乱数生成
    System.out.println(rnd.nextLong()); //2297825179350643621
    var data = new byte[5];
    //ランダムでバイトを生成、引数指定のバイト配列に配置
    rnd.nextBytes(data);
    for (var b : data) {
      System.out.print(b + " "); //63 -54 23 113 -76 
    }
  }
}

数値整形

  • NumberFormatクラス
    • setCurrency / setGroupingUsed などで標準フォーマットカスタマイズ可能
import java.text.NumberFormat;
import java.util.Locale;

public class Main {
  public static void main(String[] args) {
    var num1 = 1234.5678;
    //通貨フォーマット
    var nf1 = NumberFormat.getCurrencyInstance(Locale.JAPAN); 
    //整数フォーマット
    var nf2 = NumberFormat.getIntegerInstance();
    //汎用数値フォーマット(getInstance)
    var nf3 = NumberFormat.getNumberInstance();
    System.out.println(nf1.format(num1)); //¥1,235
    System.out.println(nf2.format(num1)); //1,235
    System.out.println(nf3.format(num1)); //1,234.568

    var num2 = 0.567;
    //%フォーマット
    var nf4 = NumberFormat.getPercentInstance();
    System.out.println(nf4.format(num2)); //57%
  }
}

配列操作

  • Arraysクラス
    • 配列は後からサイズ変更できない→copyOfメソッドでサイズの異なる配列に値を複製
    • copyOf、copyOfRangeはシャローコピー
    • 参照型の場合、コピー元が変わるとコピー先も変わってしまう
    • ディープコピー
//Shallow copy
import java.util.Arrays;

public class Main {
  public static void main(String[] args) {
    var  array1 = new String[] { "dog", "cat", "mouse", "fox", "lion" };
    //配列をソート
    Arrays.sort(array1);
    //配列を文字列化
    System.out.println(Arrays.toString(array1)); //[cat, dog, fox, lion, mouse]
    //ソート済の配列から値を検索
    System.out.println(Arrays.binarySearch(array1, "mouse")); //4

    var array2 = new String[] { "", "", "", "", "" };   
    //配列コピー、引数に長さ、不足分は0/nullで埋める
    var array3 = Arrays.copyOf(array2, 2);
    System.out.println(Arrays.toString(array3)); //[あ, い]

    //配列を引数で範囲指定してコピー
    var array4 = Arrays.copyOfRange(array2, 1, 7);
    System.out.println(Arrays.toString(array4)); //[い, う, え, お, null, null]

    //配列に値を設定
    Arrays.fill(array4, 4, 6, "");
    System.out.println(Arrays.toString(array4)); //[い, う, え, お, ―, ―]
  }
}
//Deep copy
import java.util.Arrays;

public class Main {
  public static void main(String[] args) {
    var list1 = new StringBuilder[] {
        new StringBuilder("ドレミファドーナツ"),
        new StringBuilder("ARAMA"),
        new StringBuilder("ハニホヘト")
      };

    var list2 = new StringBuilder[list1.length];
    for (var i = 0; i < list1.length; i++) {
      list2[i] = new StringBuilder(list1[i].toString());
    }

    list1[2].append("ハロー");
    System.out.println(Arrays.toString(list1)); //[ドレミファドーナツ, ARAMA, ハニホヘトハロー]
    System.out.println(Arrays.toString(list2)); //[ドレミファドーナツ, ARAMA, ハニホヘト]
  }
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0