そんなわけで日常会話で変な単位を使ってみましょう。体重はenergy換算で何ジュールだとか何電子ヴォルトだとか。身長は何光年だとかいった具合だ。
くだらない変換装置
<!DOCTYPE html><html><head>
<meta charset=utf8>
<meta name=viewport content="width=device-width,initial-scale=1.0">
<title>物理単位 相互変換機</title>
<style>
*{box-sizing:border-box;font-family:FixdSys,monospace}
body{max-width:650px;margin:40px auto;padding:0 20px;line-height:1.5;background-color:#f8f9fa;color:#333}
.card{background:#fff;padding:24px;border-radius:12px;box-shadow:0 4px 6px rgba(0,0,0,.05);margin-bottom:24px}
h2{margin-top:0;font-size:1.25rem;border-bottom:2px solid #eee;padding-bottom:8px}
.input-grid{display:grid;grid-template-columns:1fr;gap:16px}
.input-group label{display:block;font-weight:700;margin-bottom:6px;font-size:.95rem}
input[type=number]{width:100%;padding:10px;font-size:1rem;border:1px solid #ccc;border-radius:6px}
</style>
</head><body>
<h1>物理単位 相互変換機</h1>
<!-- 長さの相互変換 -->
<div class=card>
<h2>1. 長さの変換(メートル ⇄ 光年 ⇄ パーセク)</h2>
<div class="input-grid">
<div class="input-group">
<label for=meters>メートル(m)</label>
<input type=number id=meters step=any oninput="updateFromLength('m')">
</div>
<div class="input-group">
<label for=lightYears>光年(ly)</label>
<input type=number id=lightYears step=any oninput="updateFromLength('ly')">
</div>
<div class="input-group">
<label for=parsecs>パーセク(pc)</label>
<input type=number id=parsecs step=any oninput="updateFromLength('pc')">
</div>
</div>
</div>
<!-- 質量,energyの相互変換 -->
<div class=card>
<h2>2. 質量 energy変換 (E = mc<sup>2</sup>) (kg ⇄ J ⇄ eV)</h2>
<div class="input-grid">
<div class="input-group">
<label for=kilograms>キログラム(kg)</label>
<input type=number id=kilograms step=any oninput="updateFromEnergy('kg')">
</div>
<div class="input-group">
<label for=joules>ジュール(J)</label>
<input type=number id=joules step=any oninput="updateFromEnergy('j')">
</div>
<div class="input-group">
<label for=electronVolts>電子ヴォルト(eV)</label>
<input type=number id=electronVolts step=any oninput="updateFromEnergy('ev')">
</div>
</div>
</div>
<script>
// 物理定数
const C = 299792458, // 光速 (m/s)
METER_PER_LY = 9.4607304725808e15, // 1光年(m)
METER_PER_PC = 3.08567758149137e16, // 1パーセク(m)
EV_PER_JOULE = 6.241509074e18, // 1ジュールあたりのeV
g=a=>document.getElementById(a),
//要素
mElem = g('meters'),
lyElem = g('lightYears'),
pcElem = g('parsecs'),
kgElem = g('kilograms'),
jElem = g('joules');
// 数値を適切な形式(指数表記または通常の数値)に変換
function formatValue(val){
if(isNaN(val))return'';
if(!val)return'0';
// 極端に大きい/小さい数値は指数表示
if(Math.abs(val)>=1e6||Math.abs(val)<=1e-4)return val.toExponential(6);
return parseFloat(val.toFixed(6)).toString()
}
// 長さの相互更新
function updateFromLength(source){
let meters = 0;
if(source === 'm'){
const val = parseFloat(mElem.value);
if(isNaN(val))return lyElem.value = pcElem.value = '';
meters = val;
lyElem.value = formatValue(meters / METER_PER_LY);
pcElem.value = formatValue(meters / METER_PER_PC);
}else if(source === 'ly'){
const val = parseFloat(lyElem.value);
if(isNaN(val)){ mElem.value = ''; pcElem.value = ''; return; }
meters = val * METER_PER_LY;
mElem.value = formatValue(meters);
pcElem.value = formatValue(meters / METER_PER_PC);
}else if(source === 'pc'){
const val = parseFloat(pcElem.value);
if(isNaN(val))return mElem.value = lyElem.value = '';
meters = val * METER_PER_PC;
mElem.value = formatValue(meters);
lyElem.value = formatValue(meters / METER_PER_LY);
}
}
// 質量/energyの相互更新
function updateFromEnergy(source){
let joules = 0;
const evElem = g('electronVolts');
if(source === 'kg'){
const kg = parseFloat(kgElem.value);
if(isNaN(kg))return jElem.value = evElem.value = '';
joules = kg * Math.pow(C, 2);
jElem.value = formatValue(joules);
evElem.value = formatValue(joules * EV_PER_JOULE);
}else if(source === 'j'){
const j = parseFloat(jElem.value);
if(isNaN(j))return kgElem.value = evElem.value = '';
joules = j;
kgElem.value = formatValue(joules / Math.pow(C, 2));
evElem.value = formatValue(joules * EV_PER_JOULE);
}else if(source === 'ev'){
const ev = parseFloat(evElem.value);
if(isNaN(ev))return kgElem.value = jElem.value = '';
joules = ev / EV_PER_JOULE;
kgElem.value = formatValue(joules / Math.pow(C, 2));
jElem.value = formatValue(joules)
}
}
// 初期化(1m と 1kg を既定値として表示)
mElem.value = 1;
updateFromLength('m');
kgElem.value = 1;
updateFromEnergy('kg');
</script>