#include <iostream>
#include <cmath>
using namespace std;
// 度分秒结构体
typedef struct dms {
int degrees;
int minutes;
double seconds;
}DMS;
// 度分秒转十进制度
double dms_to_deg(int degrees, int minutes, double seconds) {
return degrees + minutes / 60.0 + seconds / 3600.0;
}
// 十进制度转度分秒
DMS deg_to_dms(double degrees) {
DMS dms;
double abs_deg = fabs(degrees);
dms.degrees = static_cast<int>(abs_deg);
double frac_deg = abs_deg - dms.degrees;
double total_minutes = frac_deg * 60.0;
dms.minutes = static_cast<int>(total_minutes);
double frac_minutes = total_minutes - dms.minutes;
dms.seconds = frac_minutes * 60.0;
dms.seconds = round(dms.seconds * 1e9) / 1e9; // 四舍五入减少误差
// 处理秒溢出
int extra_minutes = static_cast<int>(dms.seconds / 60.0);
dms.seconds -= extra_minutes * 60.0;
dms.minutes += extra_minutes;
// 处理分溢出
int extra_degrees = dms.minutes / 60;
dms.minutes %= 60;
dms.degrees += extra_degrees;
// 处理负数
if (degrees < 0) {
dms.degrees = -dms.degrees;
}
return dms;
}
int main() {
// 示例1:DMS转DD
double dd = dms_to_deg(36, 15, 25.5);
cout << "36度15分25.5秒 = " << dd << "度" << endl;
// 示例2:DD转DMS
DMS dms = deg_to_dms(dd);
cout << dd << "度 = "
<< dms.degrees << "度 "
<< dms.minutes << "分 "
<< dms.seconds << "秒" << endl;
// 示例3:负数测试
DMS neg_dms = deg_to_dms(-34.5);
cout << "-34.5度 = "
<< neg_dms.degrees << "度 "
<< neg_dms.minutes << "分 "
<< neg_dms.seconds << "秒" << endl;
// 示例4:进位测试
double edge_case = dms_to_deg(30, 59, 60);
cout << "30度59分60秒 = " << edge_case << "度" << endl;
DMS edge_dms = deg_to_dms(edge_case);
cout << edge_case << "度 = "
<< edge_dms.degrees << "度 "
<< edge_dms.minutes << "分 "
<< edge_dms.seconds << "秒" << endl;
return 0;
}