WEBVTT

1
00:00:00.000 --> 00:00:01.029
こんにちは。

2
00:00:01.029 --> 00:00:05.485
今回はジャバスクリプトのマス・トランクを紹介します。

3
00:00:05.485 --> 00:00:11.485
これは、数値の小数部を取り除いて、整数部だけを返す標準のメソッドです。

4
00:00:11.485 --> 00:00:17.142
特徴は、正の数でも負の数でも、ゼロに近づく方向へ処理することです。

5
00:00:17.142 --> 00:00:21.513
たとえば予定より百二十五秒遅れたら二分、百二十五秒早ければマイナス二分、

6
00:00:21.513 --> 00:00:25.884
といった表示を考えてください。

7
00:00:25.884 --> 00:00:32.227
符号の向きによらず端数だけを落としたい場面で、この関数がぴったり合います。

8
00:00:32.227 --> 00:00:41.483
この動画では、基本の使い方から、差分時間を分へ変換する完成例、そして間違えやすい注意点までを順に解説します。

9
00:00:41.483 --> 00:00:45.940
まずは、丸める方向の考え方から確かめていきましょう。

10
00:00:45.940 --> 00:00:47.183
まず動作環境です。

11
00:00:47.183 --> 00:00:54.776
マス・トランクはジャバスクリプト標準の組み込みメソッドで、ブラウザーとノード・ジェイエスの両方で利用できます。

12
00:00:54.776 --> 00:00:59.332
二千十五年七月から主要ブラウザー間で広く利用できる機能とされており、現行のクローム、

13
00:00:59.332 --> 00:01:03.887
エッジ、ファイアフォックス、サファリで使えます。

14
00:01:03.887 --> 00:01:09.272
ドムや外部パッケージには依存しないため、同じコードを両方の環境で実行できます。

15
00:01:09.272 --> 00:01:13.690
記事のサンプルはノード・ジェイエス二十二以降を対象としています。

16
00:01:13.690 --> 00:01:19.074
古い環境を対象にする場合は、タイプオブで関数かどうかを最初に確認してください。

17
00:01:19.074 --> 00:01:24.320
ただし、その確認だけで他の構文や機能までは保証できない点には注意が必要です。

18
00:01:24.320 --> 00:01:26.018
基本の書き方を見ましょう。

19
00:01:26.018 --> 00:01:29.283
呼び出し方はマス・トランク、かっこ、エックスです。

20
00:01:29.283 --> 00:01:33.202
引数に数値を一つ渡すと、小数部を取り除いた整数部が返ります。

21
00:01:33.202 --> 00:01:37.120
たとえば七点八は七に、マイナス七点八はマイナス七になります。

22
00:01:37.120 --> 00:01:40.124
すでに整数の七を渡せば、そのまま七が返ります。

23
00:01:40.124 --> 00:01:45.610
マスはコンストラクターではないため、インスタンスを作る必要はなく、直接呼び出します。

24
00:01:45.610 --> 00:01:50.312
戻り値の型はナンバーのままで、整数専用の別の型になるわけではありません。

25
00:01:50.312 --> 00:01:56.059
元の変数は書き換えられず、処理はその場で完了するため、アウェイトのような待機も不要です。

26
00:01:56.059 --> 00:01:58.932
まずはこの三つの例で感覚をつかんでください。

27
00:01:58.932 --> 00:02:01.290
ここが一番大切なポイントです。

28
00:02:01.290 --> 00:02:07.422
日本語で小数点以下を切り捨てるとだけ言うと、負の数の扱いがあいまいになります。

29
00:02:07.422 --> 00:02:16.856
マス・トランクでマイナス七点八を処理するとマイナス七ですが、負の無限大方向へ丸めるマス・フロアではマイナス八になります。

30
00:02:16.856 --> 00:02:22.202
差の大きさから端数だけを除きたい場合は、ゼロ方向への処理が合います。

31
00:02:22.202 --> 00:02:29.749
一方で、負の数を含む座標を区画へ割り当てるような場面では、別の丸め方が必要になることもあります。

32
00:02:29.749 --> 00:02:37.139
大切なのは、関数ありきではなく、先に業務上のルールを決めてから、それに合う関数を選ぶことです。

33
00:02:37.139 --> 00:02:40.912
名前が似ていても、向きが違えば結果も変わります。

34
00:02:40.912 --> 00:02:42.976
特殊な値の扱いを確認します。

35
00:02:42.976 --> 00:02:46.810
数値以外の値を渡すと、まず数値への変換が行われます。

36
00:02:46.810 --> 00:02:50.939
たとえば文字列の八点九は、八として処理できてしまいます。

37
00:02:50.939 --> 00:02:56.100
変換できない文字列はエヌエーエヌになり、無限大は無限大のまま返ります。

38
00:02:56.100 --> 00:03:00.524
つまり、異常な値が自動で普通の整数に直るわけではありません。

39
00:03:00.524 --> 00:03:05.537
また、ビッグイントはこの関数では処理できず、タイプエラーになります。

40
00:03:05.537 --> 00:03:09.076
そしてマイナスゼロ点五の整数部は、負のゼロです。

41
00:03:09.076 --> 00:03:16.449
表示に負のゼロが不要なら、後で紹介するように、結果がゼロのときに通常のゼロへそろえる処理を加えます。

42
00:03:16.449 --> 00:03:22.052
符号そのものに意味がある用途では、正規化するかどうかを先に判断してください。

43
00:03:22.052 --> 00:03:23.975
ここからは完成例です。

44
00:03:23.975 --> 00:03:31.143
トゥー・ホール・ミニッツという関数は、差分の秒数を受け取り、整数の分へ変換します。

45
00:03:31.143 --> 00:03:38.660
最初に、ナンバー・イズ・セーフ・インテジャーで、入力が安全な整数かどうかを確かめます。

46
00:03:38.660 --> 00:03:46.527
小数の秒数や文字列、エヌエーエヌ、無限大は受け付けず、問題があればタイプエラーを投げます。

47
00:03:46.527 --> 00:03:51.597
次に秒数を六十で割り、マス・トランクで分の端数を除きます。

48
00:03:51.597 --> 00:03:58.065
最後に、結果がゼロの場合は負のゼロではなく通常のゼロを返すようそろえます。

49
00:03:58.065 --> 00:04:07.680
なお、この厳しい入力制限は用途に合わせた設計であり、マス・トランク自体の制限ではない点も覚えておいてください。

50
00:04:07.680 --> 00:04:10.651
変換結果を具体的な数で確かめます。

51
00:04:10.651 --> 00:04:16.070
百二十五秒は二分、マイナス百二十五秒はマイナス二分になります。

52
00:04:16.070 --> 00:04:22.712
百二十五を六十で割ると約二点ゼロ八三三なので、端数を除くと二になるからです。

53
00:04:22.712 --> 00:04:27.780
五十九秒とマイナス五十九秒は、どちらもゼロ分にそろいます。

54
00:04:27.780 --> 00:04:32.150
一分未満の差は、正負のどちらでも表示上はゼロです。

55
00:04:32.150 --> 00:04:36.345
六十秒は一分、マイナス六十秒はマイナス一分です。

56
00:04:36.345 --> 00:04:41.064
正の側と負の側で対称に処理できていることが分かります。

57
00:04:41.064 --> 00:04:48.580
この結果はノード・ジェイエスの実機でも確認済みで、記事の期待出力と完全に一致しました。

58
00:04:48.580 --> 00:04:51.248
期待出力をまとめて読みましょう。

59
00:04:51.248 --> 00:04:57.918
マイナス五十九秒を変換した結果が負のゼロかどうかを調べると、フォルスが返ります。

60
00:04:57.918 --> 00:05:01.753
関数の最後で通常のゼロへそろえているためです。

61
00:05:01.753 --> 00:05:06.339
一方、文字列の百二十五を渡すと、タイプエラーと、安全な整数を指定してください、

62
00:05:06.339 --> 00:05:10.924
というメッセージが表示されます。

63
00:05:10.924 --> 00:05:20.595
マス・トランク単体では文字列も変換されてしまいますが、この完成例では事前の検証が入力ミスをはっきり知らせてくれます。

64
00:05:20.595 --> 00:05:26.098
出力の一行一行が、どの処理の結果なのかを追って読むことが大切です。

65
00:05:26.098 --> 00:05:32.768
特に、ゼロの扱いとエラー行は見落としやすいので、最後まで丁寧に確認してください。

66
00:05:32.768 --> 00:05:36.486
失敗例として、ビット演算による代用に注意しましょう。

67
00:05:36.486 --> 00:05:41.777
小数部を除くために、パイプ記号とゼロを使う書き方を見かけることがあります。

68
00:05:41.777 --> 00:05:46.211
しかしこの方法は、符号付き三十二ビット整数への変換を伴います。

69
00:05:46.211 --> 00:05:52.003
たとえば三十億点五では、マス・トランクなら三十億が返りますが、ビット演算ではマイナス十二億九千四百九十六万七千二百九十六という、

70
00:05:52.003 --> 00:05:57.794
まったく違う値になってしまいます。

71
00:05:57.794 --> 00:06:02.228
小さい値では偶然うまくいくため、気づきにくいのが厄介な点です。

72
00:06:02.228 --> 00:06:06.232
一般的な数値の整数部を取り出したいだけなら、意図がそのまま伝わるマス・トランクを使うほうが、

73
00:06:06.232 --> 00:06:10.236
読みやすく安全です。

74
00:06:10.236 --> 00:06:15.236
もう一つの注意点は、表示用の値と判定用の値を分けることです。

75
00:06:15.236 --> 00:06:19.569
差分がマイナス五十九秒でも、表示はゼロ分になります。

76
00:06:19.569 --> 00:06:27.069
早着か遅延かを判断する場面で、この丸めた結果だけを使うと、符号の情報が失われてしまいます。

77
00:06:27.069 --> 00:06:32.569
元の秒数は必ず別に保持し、丸めるのは表示用の値だけにしてください。

78
00:06:32.569 --> 00:06:39.736
また、マス・トランクは浮動小数点演算で生じた誤差そのものを修復する機能ではありません。

79
00:06:39.736 --> 00:06:47.903
金額や厳密な小数計算に転用する場合は、数値の持ち方と端数処理のルールを別途設計する必要があります。

80
00:06:47.903 --> 00:06:51.736
便利な関数ほど、使いどころの線引きが大切です。

81
00:06:51.736 --> 00:06:53.588
活用場面とまとめです。

82
00:06:53.588 --> 00:07:02.680
差分の秒数から整数の分を作る処理は、予定と実績を比べる管理画面や、処理時間の差を簡潔に示すログで役立ちます。

83
00:07:02.680 --> 00:07:09.246
正と負を対称に扱い、端数を表示しない、という要件に合う場面で採用してください。

84
00:07:09.246 --> 00:07:14.802
実務では、今回のような変換関数へ表示規則を集めるのがおすすめです。

85
00:07:14.802 --> 00:07:21.368
画面ごとに直接計算すると、負の数の丸め方やゼロの表示がばらつきやすいためです。

86
00:07:21.368 --> 00:07:26.251
さらに、秒数の正と負がそれぞれ何を意味するのかを、引数の説明として残しておくと、

87
00:07:26.251 --> 00:07:31.133
後から使う人も判断しやすくなります。

88
00:07:31.133 --> 00:07:36.521
まずは小さな値で試して、ゼロ方向へ丸める感覚をつかんでください。

89
00:07:36.521 --> 00:07:38.036
お疲れさまでした。
