Поскольку даже код Microsoft содержит ошибки, может быть полезно предоставить правильный псевдокод для преобразования.
Чтобы преобразовать десятичные градусы x в градусы ( d ), минуты ( m ) и (десятичные) секунды ( s ), выполните следующие действия:
Declare d, m as integer, s as float
If x < 0, then sign = -1 else sign = +1
Let y = Abs(x) ' Work with positive values only.
Let d = Int(y) ' Whole degrees. Floor() is ok too.
Let z = 60*(y - d) ' The fractional degrees, converted to minutes.
Let m = Int(z) ' Whole minutes.
Let s = 60*(z - m) ' The fractional minutes, converted to seconds.
Assert sign*(((s/60) + m)/60 + d) == x ' This confirms a correct result.
Return (sign*d, m, s)
Вместо того, чтобы возвращать подписанную степень, вы можете указать N / S или E / W в конце:
If x is a latitude, then
If sign == -1 then hemisphere = "S" else hemisphere = "N"
Else {x is a longitude}
If sign == -1 then hemisphere = "W" else hemisphere = "E"
End if
Return (d, m, s, hemisphere)
Если хотите, вы можете округлить s до целого числа и отформатировать результаты в соответствии с формой, указанной в вопросе.