2010-04-05 36 views

Trả lời

0

Sử dụng fmod và làm tròn để tách độ và phân tách. Nhân phần nhỏ với 60 và lặp lại để nhận phút và phần còn lại. Sau đó nhân phần cuối cùng với 60 lần nữa để lấy số giây.

+1

Bạn có thể có nghĩa là 'math.modf'. – musiphil

6

Chỉ cần một vài * 60 phép nhân và một vài int sự cắt, ví dụ:

>>> decdegrees = 31.125 
>>> degrees = int(decdegrees) 
>>> temp = 60 * (decdegrees - degrees) 
>>> minutes = int(temp) 
>>> seconds = 60 * (temp - minutes) 
>>> print degrees, minutes, seconds 
31 7 30.0 
>>> 
12

Đây chính là điều divmod được phát minh cho:

>>> def decdeg2dms(dd): 
... mnt,sec = divmod(dd*3600,60) 
... deg,mnt = divmod(mnt,60) 
... return deg,mnt,sec 

>>> dd = 45 + 30.0/60 + 1.0/3600 
>>> print dd 
45.5002777778 
>>> decdeg2dms(dd) 
(45.0, 30.0, 1.0) 
+4

Tôi không nghĩ rằng điều này làm việc cho âm bản. –

+2

Nó không hoạt động với âm. -122,442 trả về (-123,33,28,8). Nên là (-122,26,31.12) –

+0

@baens - ý bạn là '(-122, -26, -31.12)'? Tôi nghĩ rằng '-123 + 33/60 + 28.8/3600' thực tế bằng' -122.442' – PaulMcG

7

Dưới đây là phiên bản cập nhật của tôi dựa trên Paul McGuire. Điều này nên xử lý âm một cách chính xác.

def decdeg2dms(dd): 
    is_positive = dd >= 0 
    dd = abs(dd) 
    minutes,seconds = divmod(dd*3600,60) 
    degrees,minutes = divmod(minutes,60) 
    degrees = degrees if is_positive else -degrees 
    return (degrees,minutes,seconds) 
5

Nếu bạn muốn xử lý phủ định đúng cách, biện pháp khác 0 không được đặt âm. Nó là phương pháp phổ biến để chỉ định tất cả các độ, phút và giây là âm (Wikipedia cho thấy 40 ° 26.7717, -79 ° 56.93172 như một ví dụ hợp lệ về ký hiệu độ-phút, trong đó độ âm và phút không có dấu), và thiết lập độ như tiêu cực không có bất kỳ tác dụng nếu độ phần là 0. Đây là một chức năng để xử lý thích đáng này, dựa trên Paul McGuire và chức năng baens':

def decdeg2dms(dd): 
    negative = dd < 0 
    dd = abs(dd) 
    minutes,seconds = divmod(dd*3600,60) 
    degrees,minutes = divmod(minutes,60) 
    if negative: 
     if degrees > 0: 
      degrees = -degrees 
     elif minutes > 0: 
      minutes = -minutes 
     else: 
      seconds = -seconds 
    return (degrees,minutes,seconds) 
2

Đây là mã Python tôi:

def DecimaltoDMS(Decimal): 
d = int(Decimal) 
m = int((Decimal - d) * 60) 
s = (Decimal - d - m/60) * 3600.00 
z= round(s, 2) 
if d >= 0: 
    print ("N ", abs(d), "º ", abs(m), "' ", abs(z), '" ') 
else: 
    print ("S ", abs(d), "º ", abs(m), "' ", abs(z), '" ') 
+2

Sử dụng 'Decimal' làm tên biến có thể xung đột với' decimal.Decimal' và không phải là ý hay. – musiphil

0

Dấu hiệu tốt hơn phải được trả lại riêng biệt để có thể sử dụng để chọn từVí dụ: 0 hoặc ('E', 'W').

import math 

def dd_to_dms(degs): 
    neg = degs < 0 
    degs = (-1) ** neg * degs 
    degs, d_int = math.modf(degs) 
    mins, m_int = math.modf(60 * degs) 
    secs  =   60 * mins 
    return neg, d_int, m_int, secs 
Các vấn đề liên quan