在Java中操作时,我可以混合浮点值、长值和双值吗?

在Java中操作时,我可以混合浮点值、长值和双值吗?,java,android,performance,floating-point,Java,Android,Performance,Floating Point,我从不同的函数中得到一些值,一些浮点数,其他双精度数,长 我需要和他们合作 不事先转换为相同类型的数字是否正确 例如: float distanceInMetersFloat = initialPosition.distanceTo(finalPosition); long deltaTimeNanosLong = (finalPosition.getElapsedRealtimeNanos() - initialPosition.getElapsedRealtimeNanos()); // n

我从不同的函数中得到一些值,一些浮点数,其他双精度数,长

我需要和他们合作

不事先转换为相同类型的数字是否正确

例如:

float distanceInMetersFloat = initialPosition.distanceTo(finalPosition);
long deltaTimeNanosLong = (finalPosition.getElapsedRealtimeNanos() - initialPosition.getElapsedRealtimeNanos()); // nanoseconds
long deltaTimeSecondsLong = deltaTimeNanosLong / 1000000000;

double speed = distanceInMetersFloat / deltaTimeNanosLong;

我的精度比我需要的要高很多,丢失一些十进制数字对我来说并不重要。

floatint都是32位的原语,所以如果你想做沙拉,准备碗来容纳它们?(doublelong),此外,long和Int都是整数,因此您必须小心且明确地对这些数字进行强制转换,否则您将得到奇怪的结果…

我将尝试猜测您想要什么。 重要的部分是:

  • 必须使用尽可能高的精度执行数学运算 有。因此,在这种情况下,您的原始代码实际上是很好的(尽管速度是一个
    double
    ,除非您将
    distanceInMetersFloat
    也设为
    double
    ),否则它现在是无用的。

  • 一旦你有了
    速度
    ,你就可以使用你想要的任何舍入模式将其转换成你想要的任何精度。有关如何完成的详细信息 这在java中可以看到答案

  • 请清楚,您正在混合32位值和64位数字。所以,您需要努力获得更大的64位结果,以避免数据丢失

    请注意,您正在混合整数和小数

    对于以上两个问题,请仔细研究语法如何处理数字文本

    所以是的,你可以混合这些类型。Java通常会做正确的事情。例如,将
    long
    乘以
    int
    将产生
    long
    。但是在一些复杂代码中,编译器可能会感到困惑,您需要添加一些显式强制转换,例如
    (long)
    。任何Java入门书籍或Oracle教程都将引导您了解这一点

    小贴士:

    • L
      附加到
      long
      文本
    • f
      附加到
      float
      文本。和
      d
      double
      文本
    • 使用下划线将数字分组以便于阅读。例:
      1\u 000\u 000
    最后,请注意
    float
    double
    都是浮点数。技术以精度换取性能。这对于在绘图或渲染游戏中渲染曲线是好的,但对于金钱或其他值则是坏的,因为在小数点中不需要额外的数字

    BigDecimal

    如果准确性很重要,我会将所有值转换为对象,而不是原语
    BigDecimal
    避免使用浮点。要慢得多,但准确得多。

    这是一个非常原始的问题,可能是程序员在培训期间首先要学习的内容之一。我不是程序员,而是一名工科学生。我来自Matlab,在那里你不必定义它。我在学习,我不知道你为什么投反对票。