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而不产生截断误差