teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

BigDecimalの取得

2020/05/02 01:53

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -11,7 +11,7 @@
11
11
 
12
12
  BigDecimal[] array = new BigDecimal[3];
13
13
  for (int i = 0 ; i < 3 ; i++) {
14
- array[i] = new BigDecimal(scan.next());
14
+ array[i] = new BigDecimal(scan.next());
15
15
  }
16
16
  int result = array[2].pow(2).compareTo(array[0].pow(2).add(array[1].pow(2)));
17
17
  if(result < 0){
@@ -23,4 +23,28 @@
23
23
  }
24
24
  }
25
25
  }
26
+ ```
27
+ 追記:改めて調べてみたら、Scannerで直接BigDecimalを取得できたので変更
28
+ ```java
29
+ import java.util.Scanner;
30
+ import java.math.BigDecimal;
31
+
32
+ public class ClassifyingToys{
33
+ public static void main(String[] args){
34
+ Scanner scan = new Scanner(System.in);
35
+
36
+ BigDecimal[] array = new BigDecimal[3];
37
+ for (int i = 0 ; i < 3 ; i++) {
38
+ array[i] = scan.nextBigDecimal();
39
+ }
40
+ int result = array[2].pow(2).compareTo(array[0].pow(2).add(array[1].pow(2)));
41
+ if(result < 0){
42
+ System.out.println(" : acute-angled");
43
+ }else if(result == 0){
44
+ System.out.println(" : right-angled");
45
+ }else{
46
+ System.out.println(" : obtuse-angled");
47
+ }
48
+ }
49
+ }
26
50
  ```

2

説明追加

2020/05/02 01:53

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -1,4 +1,6 @@
1
- コンピュータは10進数の小数を正確に表現できません。分母が2の累乗になるような既約分数(1/2,3/4など)以外は誤差が生じます。10進数計算を正確に行いたいなら、BigDecimalを使うなどの方法になりま
1
+ コンピュータが扱う2進数で、ほとんどの10進数の小数を正確に表現できません。分母が2の累乗になるような既約分数(1/2,3/4など)以外は誤差が生じます。辺の詳細は→[double,float型とBigDecimalクラスは何がう違うか?](https://teratail.com/questions/172535#reply-256899)
2
+ 0.03,0.04,0.05をdoubleに変換した時点で誤差が生じており、それぞれの2乗計算ではその誤差が累積するため、直角になる条件である「引き算の結果がちょうど0」は満たせません。整数と一致するdoubleであれば誤差が生じないので成立しますが。
3
+ 10進数の計算を正確に行いたいなら、BigDecimalを使うなどの方法になります。
2
4
  ```java
3
5
  import java.util.Scanner;
4
6
  import java.math.BigDecimal;

1

カッコが足りなかった

2020/05/01 18:54

投稿

swordone
swordone

スコア20675

answer CHANGED
@@ -11,7 +11,7 @@
11
11
  for (int i = 0 ; i < 3 ; i++) {
12
12
  array[i] = new BigDecimal(scan.next());
13
13
  }
14
- int result = array[2].pow(2).compareTo(array[0].pow(2).add(array[1].pow(2));
14
+ int result = array[2].pow(2).compareTo(array[0].pow(2).add(array[1].pow(2)));
15
15
  if(result < 0){
16
16
  System.out.println(" : acute-angled");
17
17
  }else if(result == 0){