以文本方式查看主题

-  中华农历论坛  (http://bbs.nongli.net/index.asp)
--  历法知识  (http://bbs.nongli.net/list.asp?boardid=2)
----  [求助]关于回历计算。希望许先生能来帮我看看  (http://bbs.nongli.net/dispbbs.asp?boardid=2&id=16542)

--  作者:chwc
--  发布时间:2009/1/4 18:55:00
--  [求助]关于回历计算。希望许先生能来帮我看看

据《寿星万年历》中的回历计算介绍,我写了一个回历计算代码。希望许先生能来帮我看看会不会出错。要不是看到《寿星万年历》中的回历计算介绍,我以前对回历算法一点也不知。

function floor(x){/////数学函数
  return Math.floor(x);
}

function huili(y,m,d,h){
var n = (floor((round(JD(y,m,d,h,0,0,8)*1000)/1000)-0.167)-1948439);///总积日;从公元622年7月16日起连续按日计数。积日从0开始
var k = floor( (n+0.1)/10631 );/////某一周的周首相对于回历开始日偏移的周数
var A = n -k*10631;/////某日相对于周首的偏移日数
var y = floor( (A+0.5)/354.366 );////某日相对于年首的偏移日
var B = A - floor( y*354.366+0.5 );////某一日相对于该日所在月的月首编移的日数
var m = floor( (B+0.11)/29.51 );
var d = B - floor(29.5001*m+0.5);
var hy0=y+1+k*30;////回历年
var hy=hy0;if(hy0<=0)hy=\'前\'+(-hy0+1);
var hm=m+1;////回历月
var hd=d+1;////回历日
var huli=\'回历\'+hy+\'年\'+hm+\'月\'+hd+\'日\';
return huli;
}


--  作者:xjw01
--  发布时间:2009/1/5 9:32:00
--  

 getHuiLi:function(d0,r){ //回历计算
  //以下算法使用Excel测试得到,测试时主要关心年临界与月临界
  var z,y,m,d;
  d = d0 + 503105;          z = int2((d+0.1)/10631);   //10631为一周期(30年)
  d -= z*10631;             y = int2((d+0.5)/354.366); //加0.5的作用是保证闰年正确
  d -= int2(y*354.366+0.5); m = int2((d+0.11)/29.51);
  d -= int2(m*29.51+0.5);
  r.Hyear = z*30+y+1;
  r.Hmonth= m+1;
  r.Hday  = d+1;
 }
你的算法与以上《寿星万年历》的算法基本相同,不同之处在于总积数的计算。

总积日的计算与小时数无关,所以入口参数不需要“小时”参数

var n = (floor((round(JD(y,m,d,h,0,0,8)*1000)/1000)-0.167)-1948439);

如果JD()返回标准的儒略日数,这一行最好改写为

var n = floor(JD(y,m,d,0,0,0,0)+0.51 - (2451545-503105) );

var n = floor(JD(y,m,d,0,0,0,0) - 1948439.49 );

var n = floor(JD(y,m,d,0,0,0,0) - 1948439.5 ); //如果JD()可以正常处理2的整指数值的线性组合值而不产生截断(一般是可以正确处理的),现代计算机是以二进制表达数值的,可以精确表达2的整指数值的线性组合值。十进制值0.5可以用二进制精确表达为0.1而不产生截断误差

 


--  作者:chwc
--  发布时间:2009/1/5 18:48:00
--  
多谢
--  作者:客人
--  发布时间:2010/3/31 12:24:00
--  
我用上面的办法为什么算不对,2000.1.1儒略日d0是2451545.0,但怎么从儒略日算回历就是算不对呢,算出来的回历老是8338.11.1,能帮帮我吗?急啊