将python转换为java float vs double

将python转换为java float vs double,java,python,Java,Python,我需要将转换为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)

我需要将转换为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获取这些数据。我只想输入纬度和经度,得到太阳和月亮的升起和落下时间。

对每个变量使用
双精度
就足够了;但是,整数除法会导致一个问题:

double a = 367 * y - 7 * (y + (m + 9) / 12) / 4 + 275 * m / 9;
如果我是你,我会将
y
m
d
h
全部改为
double
s,因此在除法时保留小数位:

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;
}

如果你需要非常高的精度,最好的方法就是使用, ,它从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;
}

错过了。我会做出改变。感谢您提供的信息。考虑到我只需要5分钟内的精度,您认为我应该使用BigDecimal而不是double,因为我在转换过程开始时使用BigDecimal吗?@timv它肯定要精确得多,我不知道您需要多少精度,但如果我是您,并且我正在寻找更高的精度,我会使用它。小心,因为如果你用双精度来初始化BigDecimal,那么建议使用BigDecimal,然后将其与不推荐的双精度构造函数一起使用也很有趣。也许我可以在转换过程中将它们保留为双精度,用几个位置(LAT、lngs)运行一些测试然后再次测试用大小数替换双精度。然后我会用我的发现来回答我的问题。太棒了@timv让我知道它是如何为您工作的:使用像我的()这样的API会容易得多,并且可以实现良好的精度(与官方USNO数据非常一致),并且可以轻松地将结果转换为
java.time
-类型。在Android上,您可以使用。