这是我当前的代码,输出如下:

请输入大于2299160的儒略日数

2299161

15 10 1582

但是,例如,如果有小数点2299161.1等,这不会为我提供确切的时间。

如何在C语言中实现?我已经知道数学了:

0.1 days = 0.1 * 24 hours   = 2 hours    (remainder 0.4 hours),
       0.4 * 60 minutes = 24 minutes (remainder 0.0 seconds)
       0.0 * 60 seconds = 0 seconds




#include <stdio.h>

int main( ) {
   double jdn; /* you will need to store the user's input here... */
   long lc, kc, nc, ic, jc;
   int day, month, year;
   printf("Please Enter a Julian Day number greater than 2299160 \n");
   scanf("%lf",&jdn);


 if( jdn > 2299160 ){
   printf("%d\n",jdn);
   lc = jdn + 68569;
   nc = ((4 * lc) / 146097);
   lc = lc - ((146097 * nc + 3) / 4);
   ic = ((4000 * (lc + 1)) / 1461001);
   lc = lc - ((1461 * ic) / 4) + 31;
   jc = ((80 * lc) / 2447);
   day = lc - ((2447 * jc) / 80);
   lc = (jc / 11);
   month = jc + 2 - 12 * lc;
   year = 100 * (nc - 49) + ic + lc;

   printf("%d %d %d\n", day, month, year);
  }
  else {
  printf("Invalid number");
}
 return 0;
}

最佳答案

推荐@Paul R使用的floor(),@ user3386109使用的%的整数*round()的组合。

#include <math.h>

double frac_d = jdn - floor(jdn);  // @Paul R

#define SecPerDay (24L*60*60)
long  frac_l = (long) round(frac_d * SecPerDay);

int sec = frac_l % 60;  // @user3386109
frac_l /= 60;
int min = frac_l % 60;
frac_l /= 60;
int hrs = total;


如果出现负儒略日期时间,使用floor()modf()很重要。

在分配给整数之前四舍五入一个double可以确保像12.99999999这样的值取整数值13而不是12。

出于可移植性的原因,对于long而不是int,其值可能会超过32767。



[编辑]

我对以下陈述的关注尚未得到证实。两种计算h,m,s的方法都可以很好地得出一致的值。仍然更喜欢使用整数方法,因为代码更少且更易于控制舍入。

“从一个整数计算h,m,s可以确保分数的值保持一致。” (无效)

关于c - C:将儒略日期转换为公历,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26165859/

10-11 18:36