数百万ドルの損失を招いた単位変換ミス
単位変換は、うまくいかなくなるまでは些細なことに思えます。小数点のずれ、単位系の混同、タイムゾーンの誤りは、軽微なバグから壊滅的な障害まで、さまざまな結果をもたらす可能性があります。これらの実例は、慎重な単位の取り扱いがなぜ重要かを示しています。
有名な単位変換の大失敗
マーズ・クライメイト・オービター (1999年) — 3億2,760万ドル
NASAのマーズ・クライメイト・オービターは、あるチームがヤード・ポンド法(重量ポンド秒)を使用し、別のチームがメートル法(ニュートン秒)を想定していたため、火星の大気圏で崩壊しました。ナビゲーションソフトウェアが推力を誤って計算し、探査機は170 km低い軌道に突入しました。
教訓: インターフェースやドキュメントでは常に単位を明示的に指定すること。決して推測してはなりません。
ギムリー・グライダー (1983年) — あわや大惨事
エア・カナダのボーイング767が、地上クルーが燃料をキログラムではなくポンドで計算したため、飛行中に燃料切れになりました。機体には22,300 kgの燃料が必要でしたが、実際に搭載されたのは22,300ポンド(約10,100 kg)で、必要量の半分以下でした。
パイロットはエンジンの止まった機体をマニトバ州ギムリーの旧空軍基地に無事着陸させました。
コロンブスとリーグ
クリストファー・コロンブスは、アラビアマイル(約1.8 km)をより短いローマンマイル(約1.5 km)と混同したことが一因で、アジアまでの距離を大幅に過小評価しました。彼が計算した日本までの距離は約3,700 kmでしたが、実際の距離は19,000 km以上あります。
開発者がよくやるミス
1. バイトとビットの混同
ネットワーク速度はビット毎秒(Mbps)で測定されますが、ストレージはバイト(MB)で測定されます。100 Mbpsの接続は毎秒約12.5 MBを転送します。
100 Mbps ÷ 8 = 12.5 MB/s
多くのユーザーがこれらの単位を混同し、「100 Mbps」の接続なのにファイルのダウンロードが遅いと感じます。
2. キロバイト:1000 vs 1024
2つの競合する規格が存在します:
| 接頭辞 | 10進数 (SI) | 2進数 (IEC) |
|---|---|---|
| K | 1,000 bytes (kB) | 1,024 bytes (KiB) |
| M | 1,000,000 bytes (MB) | 1,048,576 bytes (MiB) |
| G | 1,000,000,000 bytes (GB) | 1,073,741,824 bytes (GiB) |
「500 GB」のハードドライブは500,000,000,000バイトであり、465.66 GiBに相当します。OSがラベルよりも少ない容量を表示する理由はここにあります。
3. 温度変換
摂氏から華氏への変換式は、バグの一般的な原因です:
°F = (°C × 9/5) + 32
°C = (°F - 32) × 5/9
一部の言語では整数除算がエラーの原因になります:両方のオペランドが整数の場合、9/5 は 1.8 ではなく 1 になる可能性があります。
4. タイムゾーンのオフセット
すべてのタイムゾーンがUTCから整数時間のオフセットではありません:
- インド: UTC+5:30
- ネパール: UTC+5:45
- チャタム諸島: UTC+12:45
整数時間のオフセットを前提にすると、数百万人のユーザーに影響するアプリケーション障害が発生します。
5. 通貨の精度
金融計算では、浮動小数点ではなく正確な10進数演算を使用する必要があります:
// 間違い
0.1 + 0.2 = 0.30000000000000004
// 正しい方法 - 整数のセントを使用
const total = 10 + 20; // 30 cents
const display = (total / 100).toFixed(2); // "0.30"
当サイトの単位変換ツールで安全に単位を変換できます。
開発者のためのベストプラクティス
1. 標準単位で保存する
内部的には、各次元に1つの正規単位を使用します:
- 長さ: メートル
- 重量: キログラム(またはグラム)
- 温度: ケルビンまたは摂氏
- 時間: 秒(またはUnixタイムスタンプ)
- 通貨: 最小単位(セント)
表示単位への変換はプレゼンテーション層でのみ行います。
2. 単位を明示する
# 悪い例 - 曖昧
distance = 5000
timeout = 30
# 良い例 - 明確
distance_meters = 5000
timeout_seconds = 30
# さらに良い例 - 型安全
from dataclasses import dataclass
@dataclass
class Distance:
meters: float
@property
def kilometers(self):
return self.meters / 1000
@property
def miles(self):
return self.meters / 1609.344
3. 境界で検証する
外部ソース(API、ユーザー入力、ファイル)から単位値を受け取る場合は、即座に検証します:
def process_temperature(value: float, unit: str) -> float:
if unit == "celsius":
return value
elif unit == "fahrenheit":
return (value - 32) * 5 / 9
elif unit == "kelvin":
return value - 273.15
else:
raise ValueError(f"Unknown temperature unit: {unit}")
4. ライブラリを使用する
複雑な変換には、手動で実装するのではなく、確立されたライブラリを使用しましょう:
- Python:
pint(単位付き物理量) - JavaScript:
convert-units - Java:
javax.measure(JSR-385)
FAQ
アメリカはなぜまだヤード・ポンド法を使用しているのですか?
1975年の米国メートル法変換法では、メートル法の採用を義務ではなく任意としました。業界の抵抗、設備更新のコスト、ヤード・ポンド法に対する国民の馴染みが採用を遅らせました。現在、科学、医療、軍事ではメートル法が使用されていますが、日常の測定にはヤード・ポンド法が残っています。公式にメートル法を採用していない国は、アメリカの他にミャンマーとリベリアだけです。
多言語アプリケーションで単位変換をどのように処理すればよいですか?
内部的には標準単位で値を保存します。表示層では、ユーザーのロケールまたは設定を確認して表示単位を決定します。一部のロケールには明確な慣例(ヨーロッパではメートル法、アメリカではヤード・ポンド法)がありますが、常にユーザーがデフォルトを上書きできるようにしましょう。温度については、一部の地域(アメリカ)はデフォルトで華氏を使用しますが、世界のほとんどは摂氏を使用しています。
関連リソース
- 単位変換ツール — 数百種類の単位間で変換
- Unixタイムスタンプ解説 — 時間変換を正しく処理する
- BMI計算の解説 — 健康指標における実用的な単位変換