以秒计算年龄——奇怪的结果

Calculate age in seconds - strange result

本文关键字:结果 计算      更新时间:2023-10-16

我是编程新手,也是这里的新手。很抱歉问了这个愚蠢的问题,但我对"用秒计算你的年龄"代码中的结果有问题。它给了我一个奇怪的结果,比如6.17725e+10或-6.77414e+10。程序还没有完成,但除了结果外,一切看起来都很好(我没有得到任何错误。再次抱歉,我希望你能理解:)

#include <iostream>
using namespace std;

void title()
{
    cout << "Age Calculator" << endl << endl;
}
int byear()
{
    cout << "Enter your birth year: ";
    int by;
    cin >> by;
    return by;
}
int bmonth()
{
    cout << "Enter your birth month: ";
    int bm;
    cin >> bm;
    return bm;
}
int bday()
{
    cout << "Enter your birth day: ";
    int bd;
    cin >> bd;
    return bd;
}
int cyear()
{
    int cy;
    cout << "Enter current year ";
    cin >> cy;
    return cy;
}
int cmonth()
{
    cout << "Enter current month: ";
    int cm;
    cin >> cm;
    return cm;
}
int cday()
{
    cout << "Enter current day: ";
    int cd;
    cin >> cd;
    return cd;
}
void calculate(int by, int bm, int bd, int cy)
{
    double y = 31104000;
    long double cby = y * by;
    long double cbm = 259200 * bm;
    long double cbd = 8640 * bd;
    long double ccy = 31104000 * cy;
    cout << endl << cby << endl;
    cout << endl << ccy << endl;
    cout << endl << ccy - cby << endl;
}
int main()
{
    title();
    int by = byear();
    int bm = bmonth();
    int bd = bday();
    int cy = cyear();
    int cm = cmonth();
    int cd = cday();
    calculate(by, bm, bd, cy);
    cin.get();
    return 0;
}

正如Kenny Ostrom所评论的,由于cout使用的科学符号,所显示的值可能看起来很奇怪。要显示所有数字,可以使用cout.precision(your_precision_here)更改cout的精度。请参阅下面的问题。

如何使用cout以全精度打印双值?

首先,您所混淆的数字格式是"科学记数法"。这些信息足以打开谷歌搜索的世界,或者你可以强迫它不要用科学符号打印。

其次,您真的想使用时间库来处理任何日历内容。它将为你处理各种日历的怪异,包括闰年。幸运的是我们有时间。h

第三,我建议使用整数类型表示秒,部分原因是为了避免舍入错误和难看的小数,但主要是因为time.h就是这样使用的。只要确保它足够大。我的编译器使用64位整数表示time_t,所以我使用了:

#include <time.h>
#include <memory>
time_t get_age_in_seconds(int year, int month, int day)
{
    struct tm birthday;
    memset(&birthday, 0, sizeof(birthday));
    birthday.tm_year = year - 1900;      // years since 1900
    birthday.tm_mon = month - 1;         // months since January (0,11)
    birthday.tm_mday = day;              // day of the month (1,31)
    time_t birthday_in_seconds = mktime(&birthday);
    time_t now = time(NULL);
    return now - birthday_in_seconds;
}

不要使用替身进行计算。你不会有任何分数值,因为你没有做任何除法。

更重要的是,研究mktime()time()difftime()。你应该用这些来计算。