我需要将following python code转换为Java并且从过去记住,必须小心处理十进制值,否则结果将不准确。 我的问题是,对于所有非整数值,我可以使用双精度,因为双精度值更准确吗?
这是我转换的开始:
Python代码
def degrees(rads):
return (rads/pi)*180
def radians(degrees):
return (degrees/180 * pi)
def fnday(y, m, d, h):
a = 367 * y - 7 * (y + (m + 9) // 12) // 4 + 275 * m // 9
a += d - 730530 + h / 24
return a
Java转换
public double degress(double rads)
{
return (rads/PI)*180;
}
public double radians(double degrees)
{
return (degrees/180 * PI);
}
public double fnday(int y, int m, int d, int h)
{
double a = 367 * y - 7 * (y + (m + 9) / 12) / 4 + 275 * m / 9;
a += d - 730530 + h / 24;
return a;
}
我知道这可能是一个简单的答案,但我需要知道应用程序的月亮和太阳的位置,并且不想依赖api来获取这些数据。我很简单想要放入纬度和longitdue,让太阳和月亮升起并设定时间。
答案 0 :(得分:3)
对每个变量使用double
就足够了;但是,您有一个由整数除法引起的问题:
double a = 367 * y - 7 * (y + (m + 9) / 12) / 4 + 275 * m / 9;
如果我是你,我会将y
,m
,d
和h
改为double
,所以你保留了分开时的小数位:
public double fnday(double y, double m, double d, double h) {
double a = 367 * y - 7 * (y + (m + 9) / 12) / 4 + 275 * m / 9;
a += d - 730530 + h / 24;
return a;
}
答案 1 :(得分:0)
如果你需要一个非常大的精度,最好的方法是使用, java.lang.BigDecimal,扩展自java.math.Number。
如果需要,您甚至可以使用现有的双打:
double d = 67.67;
BigDecimal bd = new BigDecimal(d);
但是您需要使用类中的方法:
public BigDecimal degress(BigDecimal rads)
{
BigDecimal pi = new BigDecimal(PI);
return (rads.divide(pi))*180;
}