謎のコード「jan:」「178956970.625」問題
エクセルにのセルに「jan:(ジェイ エイ エヌ コロン)」と入力すると
「############・・・・」と表示され(#255個)
内容は「178956970.625」と表示されます
これは何か?
「jan:」というのは「jan:」「feb:」「mar:」「apr:」の略で使う場合か
JANコード(商品パッケージに印刷されているバーコード)の表記に使います
「178956970.625」??謎です。そして謎は私の大好物です
独自に謎を解いてみようかと思います
「############・・・・」と表示されるのは
実はエクセル君が勝手に書式設定を
ユーザー定義の「[h]:mm:ss」にしてるからです
おそらく「jan:」の「:」で時間と判断したのでしょう
「[h]:mm:ss」のように時間表示の場合
数値があまりにも大きいかマイナスの時「##########」と表示されます
書式設定を数値にして小数点以下を3桁表示すれば
ちゃんと「178956970.625」と表示されます
ちなみに「JAN:178956970625」はEPSONのプリンターEP-806AWの
ICM48 マゼンタ インクカートリッジだそうです
多分まったく関係ないと思います
「0.625」ってのが気になる
これは何かで割ってる数値??
「0.625」が整数になるには8の倍数
0.625×8で5
0.625×16で10
0.625×24で15になります
小数点以下がなくなるようにします
178956970.625×8 =1431655765
178956970.625×16=2863311530
178956970.625×24=4294967295
178956970.625×32=5726623060
178956970.625×40=7158278825
「4294967295」??
これは2進数32桁で表現することができる数値の限界数値
「4294967295」は32ビットの限界数値でよく見かける数値です
2 進数:11111111111111111111111111111111
10進数:4294967295
16進数:FFFFFFFF
エクセルで10進数から2進数の変換はDEC2BIN()関数ですが
DEC2BIN()関数は2進数の結果が9桁までしか計算できません
10進数「511」が2進数「1111111111」(←1が9個)で
10進数「512」は DEC2BIN(512)=#NUM! エラーになります
※追記:15桁までエクセルで出してみました
「111111111111111」(←1が15個)までの数式は
DEC2BIN()関数の上限
表にしてみた
| A | B | C |
1 | | 1 | 1 |
2 | | 2 | 3 |
3 | | 4 | 7 |
4 | | 8 | 15 |
5 | | 16 | 31 |
6 | | 32 | 63 |
7 | | 64 | 127 |
8 | | 128 | 255 |
9 | | 256 | 511 |
10 | | 512 | 1023 |
11 | | 1024 | 2047 |
12 | | 2048 | 4095 |
13 | | 4096 | 8191 |
14 | | 8192 | 16383 |
15 | | 16384 | 32767 |
16 | | 32768 | 65535 |
17 | | 65536 | 131071 |
18 | | 131072 | 262143 |
19 | | 262144 | 524287 |
20 | | 524288 | 1048575 |
21 | | 1048576 | 2097151 |
22 | | 2097152 | 4194303 |
23 | | 4194304 | 8388607 |
24 | | 8388608 | 16777215 |
25 | | 16777216 | 33554431 |
26 | | 33554432 | 67108863 |
27 | | 67108864 | 134217727 |
28 | | 134217728 | 268435455 |
29 | | 268435456 | 536870911 |
30 | | 536870912 | 1073741823 |
31 | | 1073741824 | 2147483647 |
32 | | 2147483648 | 4294967295 |
33 | | 4294967296 | 8589934591 |
34 | | 8589934592 | 17179869183 |
35 | | 17179869184 | 34359738367 |
36 | | 34359738368 | 68719476735 |
37 | | 68719476736 | 137438953471 |
38 | | 137438953472 | 274877906943 |
39 | | 274877906944 | 549755813887 |
40 | | 549755813888 | 1099511627775 |
41 | | 1099511627776 | 2199023255551 |
42 | | 2199023255552 | 4398046511103 |
43 | | 4398046511104 | 8796093022207 |
44 | | 8796093022208 | 17592186044415 |
45 | | 17592186044416 | 35184372088831 |
46 | | 35184372088832 | 70368744177663 |
47 | | 70368744177664 | 140737488355327 |
48 | | 140737488355328 | 281474976710655 |
セルB2)=B1*2 上の数字の2倍
セルC2)=SUM($B$1:B2) B列の合計
セルB2)上の数字の2倍することで
2進数の
1
10
100
1000
10000
100000
の数値になります
セルC2)B列の合計は
2進数の
1
11
111
1111
11111
111111
になります
32列目の 4294967295 が
2進数:11111111111111111111111111111111(←1が32個)です
だから?
「178956970.625」は「4294967295」を24で割った数値。
だから??
32ビットの限界数値を24時間で割った数値!
だから???
意味わかんない。。
偶然?いやいやいやいや
偶然でこうなるとは思えない
また違った方向から考えます
実はこの「jan:」数値が入れられるんです
jan:1
jan:2
jan:3
・
・
jan:58
jan:59
jan:60←60以上でエラーになります
表にしました
文字列表示 | 数値表示 | 小数点以下 | 時間表示 |
jan:0 | 178956970.625 | 0.62500000 | 15:00:00 |
jan:1 | 178956970.626 | 0.62569445 | 15:01:00 |
jan:2 | 178956970.626 | 0.62638888 | 15:02:00 |
jan:3 | 178956970.627 | 0.62708333 | 15:03:00 |
jan:4 | 178956970.628 | 0.62777779 | 15:04:00 |
jan:5 | 178956970.628 | 0.62847224 | 15:05:00 |
jan:6 | 178956970.629 | 0.62916666 | 15:06:00 |
jan:7 | 178956970.630 | 0.62986112 | 15:07:00 |
jan:8 | 178956970.631 | 0.63055554 | 15:08:00 |
jan:9 | 178956970.631 | 0.63124999 | 15:09:00 |
jan:10 | 178956970.632 | 0.63194445 | 15:10:00 |
jan:11 | 178956970.633 | 0.63263890 | 15:11:00 |
jan:12 | 178956970.633 | 0.63333333 | 15:12:00 |
jan:13 | 178956970.634 | 0.63402778 | 15:13:00 |
jan:14 | 178956970.635 | 0.63472220 | 15:14:00 |
jan:15 | 178956970.635 | 0.63541666 | 15:15:00 |
jan:16 | 178956970.636 | 0.63611111 | 15:16:00 |
jan:17 | 178956970.637 | 0.63680556 | 15:17:00 |
jan:18 | 178956970.638 | 0.63750002 | 15:18:00 |
jan:19 | 178956970.638 | 0.63819444 | 15:19:00 |
jan:20 | 178956970.639 | 0.63888890 | 15:20:00 |
jan:21 | 178956970.640 | 0.63958332 | 15:21:00 |
jan:22 | 178956970.640 | 0.64027777 | 15:22:00 |
jan:23 | 178956970.641 | 0.64097223 | 15:23:00 |
jan:24 | 178956970.642 | 0.64166668 | 15:24:00 |
jan:25 | 178956970.642 | 0.64236110 | 15:25:00 |
jan:26 | 178956970.643 | 0.64305556 | 15:26:00 |
jan:27 | 178956970.644 | 0.64374998 | 15:27:00 |
jan:28 | 178956970.644 | 0.64444444 | 15:28:00 |
jan:29 | 178956970.645 | 0.64513889 | 15:29:00 |
jan:30 | 178956970.646 | 0.64583334 | 15:30:00 |
jan:31 | 178956970.647 | 0.64652780 | 15:31:00 |
jan:32 | 178956970.647 | 0.64722222 | 15:32:00 |
jan:33 | 178956970.648 | 0.64791667 | 15:33:00 |
jan:34 | 178956970.649 | 0.64861110 | 15:34:00 |
jan:35 | 178956970.649 | 0.64930555 | 15:35:00 |
jan:36 | 178956970.650 | 0.65000001 | 15:36:00 |
jan:37 | 178956970.651 | 0.65069446 | 15:37:00 |
jan:38 | 178956970.651 | 0.65138888 | 15:38:00 |
jan:39 | 178956970.652 | 0.65208334 | 15:39:00 |
jan:40 | 178956970.653 | 0.65277776 | 15:40:00 |
jan:41 | 178956970.653 | 0.65347221 | 15:41:00 |
jan:42 | 178956970.654 | 0.65416667 | 15:42:00 |
jan:43 | 178956970.655 | 0.65486112 | 15:43:00 |
jan:44 | 178956970.656 | 0.65555555 | 15:44:00 |
jan:45 | 178956970.656 | 0.65625000 | 15:45:00 |
jan:46 | 178956970.657 | 0.65694445 | 15:46:00 |
jan:47 | 178956970.658 | 0.65763888 | 15:47:00 |
jan:48 | 178956970.658 | 0.65833333 | 15:48:00 |
jan:49 | 178956970.659 | 0.65902779 | 15:49:00 |
jan:50 | 178956970.660 | 0.65972224 | 15:50:00 |
jan:51 | 178956970.660 | 0.66041666 | 15:51:00 |
jan:52 | 178956970.661 | 0.66111112 | 15:52:00 |
jan:53 | 178956970.662 | 0.66180554 | 15:53:00 |
jan:54 | 178956970.663 | 0.66249999 | 15:54:00 |
jan:55 | 178956970.663 | 0.66319445 | 15:55:00 |
jan:56 | 178956970.664 | 0.66388890 | 15:56:00 |
jan:57 | 178956970.665 | 0.66458333 | 15:57:00 |
jan:58 | 178956970.665 | 0.66527778 | 15:58:00 |
jan:59 | 178956970.666 | 0.66597220 | 15:59:00 |
jan:60 | #VALUE! | #VALUE! | #VALUE! |
最初の「0.625」を時刻表示にすると「15:00:00」です
jan:1、jan:2、jan:3・・1分ずつ増えます
jan:60で#VALUE!エラーになりました
やはり時間なんでしょうか?
さらに面白いことを発見
「jan:」数値に小数点を入れると結果が大きく変わります
文字列表示 | 数値表示 | 小数点以下 | 時間表示 |
jan:0.0 | 2982616.177 | 0.17708333 | 4:15:00 |
jan:0.1 | 2982616.177 | 0.17708449 | 4:15:00 |
jan:1.1 | 2982616.177 | 0.17709607 | 4:15:01 |
jan:1.2 | 2982616.177 | 0.17709722 | 4:15:01 |
jan:1.3 | 2982616.177 | 0.17709838 | 4:15:01 |
jan:1.4 | 2982616.177 | 0.17709954 | 4:15:01 |
jan:1,5 | 2982616.177 | 0.17710069 | 4:15:01 |
jan:1.6 | 2982616.177 | 0.17710185 | 4:15:02 |
jan:59.9 | 2982616.178 | 0.17777662 | 4:16:00 |
jan:0 が「178956970.625」なのに
jan:0.0 は「2982616.17708333」になっています
178956970.666÷2982616.17708333=60
小数点を付けることで1/60になりました???
jan:の小数点以下は五捨六入されるようです
小数点を付けることで60分の1になる?
仕様でしょうね
だとすると小数点を付けるのが正しい使い方かもしれません
なんとなくわかったこと
もしかしたら数字はオプション?
jan: | ←何かしら時間を操作してる |
jan:0 | ←何かしら分を操作してる |
jan:0.0 | ←何かしら秒を操作してる |
オプションを付けることで操作対象が変わってるのかな?と思います
そもそも
4294967295は32ビット限界数値
秒で日時を計っています
秒を日にします
4294967295÷24=178956970.625
178956970.625÷60=2982616.17708333
2982616.17708333÷60=49710.2696180555
49710.2696180555 を日付にすると 2036/2/5 6:28 AM
上記の数式見たことある数字がいっぱい・・
4294967295秒
= 178956970.625分
= 2982616.17708333時間
= 49710.2696180555日
ということになりますが
分表示が「jan:0」
時間表示が「jan:0.0」
ということで
謎の「jan:」コードの正体は
32ビットの限界数値である
2進数:11111111111111111111111111111111(←1が32個)の
10進数表示を 4294967295秒(42億9496万7295秒)として
jan:0(178956970.625分)32ビット限界数値の分表示
jan:0.0(2982616.17708333時間)32ビット限界数値の時間表示
という結果になりました
※私が勝手に決めたものです根拠やソースはありません
以上 何かの参考にでもしてください。
ここから下は暇つぶし程度にご覧ください
何に使うのはまったくわかりませんが
推測するに2つの方法が思いつきます
第一に
2036年2月問題のテストではないかと思う
2036年2月問題とは2進数32桁の限界である
2進数:11111111111111111111111111111111←1が32個
(これを10進数にすると10進数:4294967295)
つまり32ビットでは
11111111111111111111111111111111+1=
4294967295+1=
実行できないのである
かといって4294967295秒で時間が止まるわけではなく
実際にはこれを超えたら何がおきるかわからないそうです
しかし分表示や時間表示にすれば実行できます
本当に?
それを検証するため
jan:0の分表示で1分~59分まで簡単に足せるように
jan:0~jan:59
また
jan:0.0~jan:59.9
1秒づつ増えるのは1を足しても平気か?
とテストするため?
第二に
エクセル関数の
VALUE()関数の計算のため?
VALUEは日時を数値に変換します
日時に対するVALUE()関数は1日を1として
1以下の小数点以下を時間で表しています
時間は1を24で割った数値
01:00:00 = 0.041666667
分は1を24で割って60で割った数値
00:01:00 = 0.000694444
秒は1を24で割って3600で割った数値になります
00:00:01 = 0.0000115740740740741
ここで
12:34:56 をVALUE()すると
0.524259259259259
普通に計算すると
12時間で 0.041666667×12=0.500000004
34分で 0.000694444×34=0.023611096
56秒で 0.0000115740740740741×56=0.000648148
合計 0.524259248148
微妙に合わない
これはエクセルが15桁以上の計算ができないためです
これを解消するため
VALUE()関数の分と秒を12で割って60で割ってとするより
元々分表示や時間表示をしてる
jan:を使ってるんじゃないか??
34分で jan:34-jan:0 = 0.023611098527908300
56秒で jan:56.0-jan:0.0 = 0.000648148357868195
(直接jan:34-jan:0はできません。セル指定します)
VALUE()の結果 0.524259259259259
普通に計算 0.524259248148
jan:で計算 0.524259246885776
え?
もっとわかりやすい数字を計算してみる
あれ?
違うかも・・
※時間表示は小数点以下6桁しか見ないので時間表示の結果は同じになります
※これも私の推測です根拠もソースもありません
自分で納得できたので終了です。
追記
またくだらない発見を・・・
jan:
jan:0
jan:0.0
だけだと思っていたのに
jan0 ←コロン「:」無しで0
が存在します
jan0 = 36526
jan31 = 43131
jan0~jan31まで
jan32はエラーになります
簡単だった
jan0 = 36526 ←2000年1月1日
jan1 = 43101 ←2018年1月1日
jan2 = 43102 ←2018年1月2日
・
・
・
jan31 = 43131 ←2018年1月31日
jan1は単に「January-1」の略だった
試しに
Feb5 = 2018年2月5日
apr20 = 2018年4月20日
セルに「1-1」や「1/1」と入力すると
2018年1月1日になります
「jan31」なら「1-31」とか「1/31」と打ったほうが早いと思う
jan:とは関係なかったようです
終了。
謎のコード「jan:」「178956970.625」でした