単位変換では「基準値」と「表示値」を分ける
風の予報値を画面に表示するとき、m/s、km/h、mph、knots のどれを選んでも同じ速度を表せる必要があります。計算の途中で表示用に丸めた値を次の変換へ渡すと、小さな誤差が積み重なります。扱いやすい方法は、いったん共通の単位へ正規化し、内部値と表示値を分離することです。
m/sを基準にした式
次の係数は各単位の値を m/s に直すためのものです。
| 入力単位 | m/sへの係数 |
|---|---|
| m/s | 1 |
| km/h | 1 / 3.6 |
| mph | 0.44704 |
| kn | 1852 / 3600 |
計算は 基準値(m/s) = 入力値 × 入力単位の係数、続けて 出力値 = 基準値 ÷ 出力単位の係数 とします。例えば 10 m/s は 36 km/h、約 22.37 mph、約 19.44 kn です。1 kn = 1.852 km/h、10 m/s = 36 km/h のような既知の値をテストに含めると、係数の取り違えを見つけやすくなります。
精度は内部で保ち、最後に表示を整える
内部計算は可能な限り丸めずに保ち、画面へ出す段階で小数点以下の桁数を整えます。例えば mph の 22.37 を再び m/s に変換すると、元の 10 m/s と完全一致はしません。これは画面表示時に情報を丸めたためです。比較や後続計算には表示文字列ではなく、丸める前の数値を使います。
往復テストで変換の一貫性を確認する
単体テストでは、値を単位AからBへ変換し、結果をBからAへ戻して元の入力と比較します。浮動小数点計算なので完全一致ではなく、小さな許容誤差 ε を使います。概念的には abs(戻した値 - 元の値) < ε を確認します。複数の単位ペアと 0、整数、小数を試し、既知の基準値テストも別に残します。往復テストだけでは、同じ誤った係数を往復で使ってしまう不具合を見逃すことがあるためです。
入力の扱いも計算の一部です。小数点と小数カンマの正規化、負数・無限大・不正な文字列の拒否を計算前に行うと、表示や比較へ不正値が流れにくくなります。
この方法を確認できる実装例として、Drone Forecastの風速コンバーターを公開しています。私はこのツールの開発者です。