0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

あなたの体重は何電子ヴォルトだ?

0
Posted at

そんなわけで日常会話で変な単位を使ってみましょう。体重は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. 長さの変換(メートル &#8644; 光年 &#8644; パーセク)</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 &#8644; J &#8644; 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>
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?