function ConvertDDToDMS(D, lng) {
return {
dir: D < 0 ? (lng ? "W" : "S") : lng ? "E" : "N",
deg: 0 | (D < 0 ? (D = -D) : D),
min: 0 | (((D += 1e-9) % 1) * 60),
sec: (0 | (((D * 60) % 1) * 6000)) / 100,
};
}
上記は、 (経度)パラメータをtrueに設定したかどうかに応じて、{deg, min, sec, dir}
secが2桁に切り捨てられ(たとえば)、dirが、、、のいずれかであるオブジェクトを提供3.14
します。例えば:N
E
S
W
lng
ConvertDDToDMS(-18.213, true) == {
deg : 18,
min : 12,
sec : 46.79,
dir : 'W'
}
または、基本的な文字列だけが必要な場合:
function ConvertDDToDMS(D){
return [0|D, 'd ', 0|(D=(D<0?-D:D)+1e-4)%1*60, "' ", 0|D*60%1*60, '"'].join('');
}
ConvertDDToDMS(-18.213) == `-18d 12' 47"`
[2019年6月編集]-正確な分を変換するときに浮動小数点演算が原因で結果が1分ずれることがある、8年前のバグを修正しましたConvertDDToDMS(4 + 20/60)
。
[2021年12月編集]-おっと。修正#2。元のコードに戻り、1e-9
a)わずかに低い浮動小数点エラーを次に大きい数値にバンプし、b).01
秒未満であるため、出力に影響を与えない値に追加されます。同じ修正である「文字列」バージョンに追加1e-4
されましたが、秒も丸められます(1/2秒に近い)。