謎のコード「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()関数の上限

表にしてみた
 ABC
1  11
2  23
3  47
4  815
5  1631
6  3263
7  64127
8  128255
9  256511
10  5121023
11  10242047
12  20484095
13  40968191
14  819216383
15  1638432767
16  3276865535
17  65536131071
18  131072262143
19  262144524287
20  5242881048575
21  10485762097151
22  20971524194303
23  41943048388607
24  838860816777215
25  1677721633554431
26  3355443267108863
27  67108864134217727
28  134217728268435455
29  268435456536870911
30  5368709121073741823
31  10737418242147483647
32  21474836484294967295
33  42949672968589934591
34  858993459217179869183
35  1717986918434359738367
36  3435973836868719476735
37  68719476736137438953471
38  137438953472274877906943
39  274877906944549755813887
40  5497558138881099511627775
41  10995116277762199023255551
42  21990232555524398046511103
43  43980465111048796093022207
44  879609302220817592186044415
45  1759218604441635184372088831
46  3518437208883270368744177663
47  70368744177664140737488355327
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:1178956970.6260.6256944515:01:00
jan:2178956970.6260.6263888815:02:00
jan:3178956970.6270.6270833315:03:00
jan:4178956970.6280.6277777915:04:00
jan:5178956970.6280.6284722415:05:00
jan:6178956970.6290.6291666615:06:00
jan:7178956970.6300.6298611215:07:00
jan:8178956970.6310.6305555415:08:00
jan:9178956970.6310.6312499915:09:00
jan:10178956970.6320.6319444515:10:00
jan:11178956970.6330.6326389015:11:00
jan:12178956970.6330.6333333315:12:00
jan:13178956970.6340.6340277815:13:00
jan:14178956970.6350.6347222015:14:00
jan:15178956970.6350.6354166615:15:00
jan:16178956970.6360.6361111115:16:00
jan:17178956970.6370.6368055615:17:00
jan:18178956970.6380.6375000215:18:00
jan:19178956970.6380.6381944415:19:00
jan:20178956970.6390.6388889015:20:00
jan:21178956970.6400.6395833215:21:00
jan:22178956970.6400.6402777715:22:00
jan:23178956970.6410.6409722315:23:00
jan:24178956970.6420.6416666815:24:00
jan:25178956970.6420.6423611015:25:00
jan:26178956970.6430.6430555615:26:00
jan:27178956970.6440.6437499815:27:00
jan:28178956970.6440.6444444415:28:00
jan:29178956970.6450.6451388915:29:00
jan:30178956970.6460.6458333415:30:00
jan:31178956970.6470.6465278015:31:00
jan:32178956970.6470.6472222215:32:00
jan:33178956970.6480.6479166715:33:00
jan:34178956970.6490.6486111015:34:00
jan:35178956970.6490.6493055515:35:00
jan:36178956970.6500.6500000115:36:00
jan:37178956970.6510.6506944615:37:00
jan:38178956970.6510.6513888815:38:00
jan:39178956970.6520.6520833415:39:00
jan:40178956970.6530.6527777615:40:00
jan:41178956970.6530.6534722115:41:00
jan:42178956970.6540.6541666715:42:00
jan:43178956970.6550.6548611215:43:00
jan:44178956970.6560.6555555515:44:00
jan:45178956970.6560.6562500015:45:00
jan:46178956970.6570.6569444515:46:00
jan:47178956970.6580.6576388815:47:00
jan:48178956970.6580.6583333315:48:00
jan:49178956970.6590.6590277915:49:00
jan:50178956970.6600.6597222415:50:00
jan:51178956970.6600.6604166615:51:00
jan:52178956970.6610.6611111215:52:00
jan:53178956970.6620.6618055415:53:00
jan:54178956970.6630.6624999915:54:00
jan:55178956970.6630.6631944515:55:00
jan:56178956970.6640.6638889015:56:00
jan:57178956970.6650.6645833315:57:00
jan:58178956970.6650.6652777815:58:00
jan:59178956970.6660.6659722015: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.12982616.1770.177084494:15:00
jan:1.12982616.1770.177096074:15:01
jan:1.22982616.1770.177097224:15:01
jan:1.32982616.1770.177098384:15:01
jan:1.42982616.1770.177099544:15:01
jan:1,52982616.1770.177100694:15:01
jan:1.62982616.1770.177101854:15:02
jan:59.92982616.1780.177776624: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

え?

もっとわかりやすい数字を計算してみる

時刻VALUE()計算jan:
0:00:100.00011574074070.00011574074070.0001157401130
0:00:200.00023148148150.00023148148150.0002314811572
0:00:300.00034722222220.00034722222220.0003472222015
    
0:10:000.00694444444440.00694444444440.0069444477558
0:20:000.01388888888890.01388888888890.0138888955116
0:30:00 0.0208333333333 0.0208333333333 0.0208333432674 

あれ?
違うかも・・

※時間表示は小数点以下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」でした




セル内の余白の取り方TOP
(C) 2001-2018 Digital World