将python转换为java float vs double

时间:2017-05-30 01:00:04

标签: java python

我需要将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,让太阳和月亮升起并设定时间。

2 个答案:

答案 0 :(得分:3)

对每个变量使用double就足够了;但是,您有一个由整数除法引起的问题:

double a = 367 * y - 7 * (y + (m + 9) / 12) / 4 + 275 * m / 9;

如果我是你,我会将ymdh改为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;
}