sixty-life

還暦を迎えた今、独学でプログラミング学習をする日々の記録

いろいろなデータ型のまとめ

基礎からのJava 改訂版

Part 02 Chapter 06(P.93)

<Chapter 06 いろいろなデータ型>の章の終わりのまとめの練習問題

練習問題

問題1

long型の変数をint型変数に代入したいと思います。括弧には何を入れればよいでしょう?

long bignum = 100;

int num = [   ①   ] bignum;

 

public class Renshu_1 {
public static void main(String[] args) {
long bignum = 100;
int num = (int)bignum;
System.out.println(num);
}
}

  datatype java Renshu_1      

100

①(int)
続きを読む

いろいろなデータ型⑤誤差・異なるデータ型の数値演算

基礎からのJava 改訂版

Part 02 Chapter 06(P.91)

誤差

型変換や算術演算によりデータの一部分が失われる場合があります。

public class Renshu_ori_4 {
public static void main(String args) {
int num = 3/2;
System.out.println(num);
}
}

  datatype java Renshu_ori_4      

1

桁落ち

この結果は1.5だが、int=整数なので切り捨てられて”1”となった。

 

public class Renshu_ori_4 {
public static void main(String args) {
//int num = 3/2;
int num = (int)1.5;
System.out.println(num);
}
}

  datatype java Renshu_ori_4      

1

少数から整数へのキャストも同様。

 

public class Renshu_ori_4 {
public static void main(String args) {
//int num = 3/2;
//int num = (int)1.5;
int num = 10000 * 10000 * 10000;
System.out.println(num);
}
}

  datatype java Renshu_ori_4

-727379968

桁あふれ

intの最大値(-231 〜231-1)を超える。

 

浮動小数は10進数ではなく2進数の計算のため、10進数ではっきり書ける数も内部的には微妙な誤差が出る。

public class Renshu_ori_5 {
public static void main(String args) {

double d = 1 - 2 * 0.4;
System.out.println(d);
}
}

  datatype java Renshu_ori_5

0.19999999999999996

丸め誤差

結果はきっちり0.2にはならない。

意図して切り捨てている場合は問題ないが、意図しないところで精度が落ちたり、値の一部が切り捨てられていると目的の結果が得られなかったり、バグの原因になる。

なお、丸め誤差について、金額計算などで1円の誤差も許されないような場合には、BigDecimalというクラスを利用して計算する。(誤差自体は無くならないが、10進数にするとおかしいというようなことはなくなる)

 

続きを読む

いろいろなデータ型④データ型のキャスト

 

基礎からのJava 改訂版

Part 02 Chapter 06(P.87)

数値データ同士は、データ型が違う変数を代入することも可能です

データ型が小さいintから大きなlongへの代入は普通にできる。

public class Renshu_ori_3 {
public static void main(String args) {
int num = 10;
long bignum = num;
System.out.println(num);
System.out.println(bignum);
}
}

  datatype java Renshu_ori_3

10

10

 

逆に大きなlongから小さいintに代入するとコンパイルエラーになる。

public class Renshu_ori_3 {
public static void main(String args) {
long bignum = 10;
int num = bignum;
System.out.println(num);
System.out.println(bignum);
}
}

  datatype javac Renshu_ori_3.java

Renshu_ori_3.java:4: エラー: 不適合な型: 精度が失われる可能性があるlongからintへの変換

        int num = bignum;

                  ^

エラー1個

longからintなど、大から小に代入する場合はデータが入りきらない可能性があるのでエラーになる。

大から小へ代入したい場合は、明示的にデータ型を変換する必要がる。この型変換をキャストという。

 

キャスト演算子

(<データ型>)<値>

 

public class Renshu_ori_3 {
public static void main(String args) {
long bignum = 10;
int num = (int)bignum; // キャストすればOK
System.out.println(num);
System.out.println(bignum);
}
}

  datatype java Renshu_ori_3      

10

10

 

「代入しても問題ない」場合、または「入りきらない場合は捨ててよい」場合にキャストを使う

「捨ててよい」というのは少数を整数にに入れる場合に小数点以下を切り捨てるなど、精度が落ちてもいいような場合のこと。

違うデータ型はダメ

キャストできるのは数値型同士などに限る。(int型の変数をboolean型にキャストするということはできない)

ただしcharについては、用途は文字なのですが内部的には整数として扱われているので整数値とのキャストが可能。

public class Renshu_ori_3 {
public static void main(String args) {
int num = 10;
char c = (char)num;
System.out.println(num);
}
}

  datatype java Renshu_ori_3      

10

整数と少数の変換

整数から小数にはキャスト演算子なしで代入可能

public class Renshu_ori_3 {
public static void main(String args) {
double d = 10; // 整数から少数はキャスト不要

System.out.println(d);
}
}

  datatype java Renshu_ori_3      

10.0

 

少数をキャストした場合、小数点以下は切り捨てられる

public class Renshu_ori_3 {
public static void main(String args) {
int num = (int)1.2; // 小数から整数へはキャスト必要

System.out.println(num);
}
}

  datatype java Renshu_ori_3      

1

doubleリテラル

float型(4バイト浮動小数)の変数に1.2など小数リテラルが代入できないのも、この大から小への型変換になるから。

fをつけない小数リテラルはdouble型と見なされるので、精度の大きいdoubleから小さいfloatにそのまま代入できないが、キャストすれば代入することは可能。

public class Renshu_ori_3 {
public static void main(String args) {
float f = (float)1.2;

System.out.println(f);
}
}

  datatype java Renshu_ori_3      

1.2

ただし、コンパイルが通るという説明のためだけのコードで普通はこう書かない。普通は1.2fと書けばいい。

public class Renshu_ori_3 {
public static void main(String args) {
float f = 1.2f;

System.out.println(f);
}
}

  datatype java Renshu_ori_3      

1.2

  da

 

本日ここまで。

続きを読む

いろいろなデータ型③浮動小数、理論値、文字

 

基礎からのJava 改訂版

Part 02 Chapter 06(P.84)

浮動小数

小数を扱う時のデータ型

<double> 特に理由がなければ通常 double を使う。(範囲が広く精度が細かい)

<float> 膨大な個数のデータを扱う時

 

浮動小数リテラル

double a = 1.2;

普通に小数点つきの数字を使う

 

double型かfloat型かを明示的に示す場合は数字の後ろにd、fをつける。d=double,

f= float

double a = 1.2d;
float b = 1.2f;

数字の後のd、f(大文字でも可)を省略した場合はdouble型とみなされる。

 

誤った例:1.2はdoubleリテラルなのでfloatに代入できない

float b = 1.2;

 

浮動小数も整数同様に算術演算子を使って計算できる。

double a = 4.3 * 1.02;

 

続きを読む

いろいろなデータ型②進数、ビットとバイト

基礎からのJava 改訂版

Part 02 Chapter 06(P.82)

進数って?

私たちは普段「10進数」で数を表記しています。

コンピュータの世界ではこのほか「2進数」「8進数」「16進数」という表記方法を使います。

 

2進数

8進数

10進数

16進数

0

0

0

0

1

1

1

1

10

2

2

2

11

3

3

3

100

4

4

4

101

5

5

5

110

6

6

6

111

7

7

7

1000

10

8

8

1001

11

9

9

1010

12

10

A

1011

13

11

B

1100

14

12

C

1101

15

13

D

1110

16

14

E

1111

17

15

F

10000

20

16

10

 

情報数学は正直難しく感じますね...。

プログラマに必要な数学(結城浩

  • 基本的な数学

四則演算(+ − × ÷)、累乗(2^3=2×2×2=8)、位取り記数法(2進法、10進法、16進法)などがある。

  • 条件分岐と論理

多くのプログラミング言語では、If文を使って処理の流れを生業します。数学の一分野「論理」を使ってプラグラムをコントロールする。

大量の情報を処理するために、プログラムを使って「繰り返し」を行う。

  • 場合分けと数え上げの法則

たくさんの条件やデータを「場合分け」するとき、プログラマは見落としが絶対に起きないように気をつけなければならない。

  • その他

再帰、指数、大数、剰余などがある。

コンピュータが数値を表現する際には、数の分類に合わせたデータ型を使う必要があります。

 

 

<整数>小数でも分数でもない-1、0、1のような数のこと

自然数>0とマイナスを含まない整数のこと。整数のうち自然数と0は「符号なし整数型」で、これに負の整数を加えたものが「符号あり整数型」となる(integer、Long)

小数と分数>表記方法が異なるだけで同じ数

<分数>整数÷整数で表現できる数

有限小数>分数を少数に直したときに、割り切れる小数のこと

循環少数>分数を少数に直したときに、割り切れずにある数列で循環する少数のこと

有理数>少数(分数)で表される数のこと。(整数、有限小数無限小数

無理数>少数(分数)で表されない数のこと(π、√2)

実数有理数無理数を含む数のこと。「浮動小数点型」「固定小数点型」「十進型(通貨型)」

※実数の上位概念として、虚数を含む複素数四元数などが存在する

 

続きを読む

いろいろなデータ型①基本データ型

基礎からのJava 改訂版

Part 02 Chapter 06(P.80)

Javaの基本データ型(プリミティブ型)

種類

用途、説明

範囲

リテラルの例

論理

boolean

真偽値

trueまたはfalse

true、false

整数

char

2バイトUnicode文字。
文字列ではなくて1文字

‘¥u0000’〜’¥uffff’

A’、’あ’、’¥u3042

 

byte

1バイト整数 (2bit)

-128(-27)〜127(27-1)

12(10進数)、
12L
011(8進数)、
0x2b(16進数)

short

2バイト整数 (16bit)

-32768(-215)〜32767(215-1)

int

4バイト整数。(32bit)
普通の数字はこれ

-231 〜231-1

long

8バイト整数。intで桁が足りない時はこれ (64bit)

-263 〜263-1

浮動少数

float

4バイト浮動小数

単精度の浮動小数点数

1.2、1.2d、1.2f

 

double

8バイト浮動小数

倍精度の浮動小数点数

 

 

データ型には「基本データ型(プリミティブ型)」と、のちに出てくる「参照型」がある。

「参照型」には配列やクラスなどが含まれる。

表の「範囲」は、格納できる値の範囲で、範囲がおおきいデータ型はいろんな数んおデータが入るが、1つのデータにつきメモリ容量をたくさん使う。

基本データ型はC言語の時代から続いているそうです。

続きを読む

乱数(ランダムな数)を使う

基礎からのJava 改訂版

Part 02 Chapter 05

ランダムな数を random.nextInt メソッドを使って取得する

int <ランダムな数> = random.nextInt ( <数の上限> ) ;

int num = rand.nextInt(10);
  • nextIntメソッドは戻り値にランダムな整数(int型)を返す。
  • 引数には乱数の上限値(int型)を指定する。

Random.nextIntを使うには

  1. インポート宣言
  2. インスタンスの作成
  3. メソッドの呼び出し
import java.util.Random; // ①インポート宣言

public class Sample3 {
public static void main(String[] args) {
Random rand = new Random(); // ②インスタンスの作成
int num = rand.nextInt(10); // ③メソッドの呼び出し

System.out.println("ラッキナンバーは" + num + "です!");
}
}

ターミナル:

  args javac Sample3.java

  args java Sample3

ラッキナンバーは6です!

 

ちなみに Randomクラス をAIで深掘りすると...

Random クラスは疑似乱数ジェネレータ(Pseudo-Random Number Generator, PRNG)を使用してランダムな数字を生成します。これは、完全にランダムではなく、初期シード値に基づいて数列を計算するアルゴリズムによって生成される数値のシーケンスです。

Random クラスによって生成される乱数は疑似乱数であるため、真のランダム性(物理的なランダム性)を必要とするセキュリティ関連の用途には適していません。セキュリティ上の目的で乱数を使用する場合は、java.security.SecureRandom というクラスを使用することが推奨されます。SecureRandom は暗号学的に強い乱数を生成し、より予測が困難です。

...だそうです。

続きを読む