C++度分秒与度转换实现

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值