简单的数学总是返回 0

Simple math always returning 0

在我的应用程序中,我将时间(0 到 60000 之间)除以某个值(在当前示例中为 60000),然后乘以 100。

但是,当将答案打印到日志中时,它总是 returns 0。

这是我的代码:

countDownTimer = new CountDownTimer(activityDuration, 1000) {
        @Override
        public void onTick(long timeLeftInMillis) {
            int minutes = (int) (timeLeftInMillis / 1000) / 60;
            int seconds = (int) (timeLeftInMillis / 1000) % 60;

            String timeLeftFormatted = String.format(Locale.getDefault(), "%02d:%02d", minutes, seconds);
            countDownTimerTextView.setText(timeLeftFormatted);

            System.out.println("L: " + timeLeftInMillis); // Returns correctly. Values between 0 and 60000
            System.out.println("Activity Duration: " + activityDuration); // Returns correctly. 60000
            System.out.println("Progress: " + (timeLeftInMillis / activityDuration) * 100); // Returns 0
        }

        @Override
        public void onFinish() {

        }
    }.start();

timeLeftInMillis / activityDuration 是整数除法,总是截断为最接近的整数。

您需要在进行除法之前转换为浮点数或双精度数,即 ((double)timeLeftInMillis / activityDuration) * 100)

给你一个正确的解决方案。我想贡献现代版本。持续时间不要使用原始数字,使用 java.time 的 Duration class(现代 Java 日期和时间 API)。也就是说,先声明activityDuration一个Duration,例如:

    final Duration activityDuration = Duration.ofMinutes(1);

恕我直言,这已经比您的值 60000 更清楚地读为 1 分钟。

    Duration timeLeft = Duration.ofMillis(timeLeftInMillis);
    int minutes = (int) timeLeft.toMinutes();
    int seconds = timeLeft.toSecondsPart();

    String timeLeftFormatted = String.format(Locale.getDefault(), "%02d:%02d", minutes, seconds);
    countDownTimerTextView.setText(timeLeftFormatted);

    System.out.println("L: " + timeLeftInMillis); // Returns correctly. Values between 0 and 60000
    System.out.println("Activity Duration: " + activityDuration); // Returns correctly. 60000
    System.out.println("Progress: " + timeLeft.multipliedBy(100).dividedBy(activityDuration));

可能的输出是:

L: 25555
Activity Duration: PT1M
Progress: 42

在这种情况下,00:25 已填充到您的文本视图中。 PT1M来自Duration.toString,意思是1分钟(ISO 8601格式,是这样的,有需要的你就可以轻松学会)。

Duration.dividedBy(Duration)方法是在Java9中引入的。对于早期的Java版本和Android,请改用:

    System.out.println(
            "Progress: " + timeLeft.multipliedBy(100).toMillis() / activityDuration.toMillis());

结果是一样的

问题:我可以在 Android 上使用 java.time 吗?

是的,java.time 适用于较旧和较新的 Android(只是适度的 Java 9 添加)。只需要至少 Java 6.

  • 在 Java 8 及更高版本和新的 Android 设备上(API 26 级及以上,有人告诉我)现代 API 出现 built-in.
  • 在 Java 6 和 7 中获取 ThreeTen Backport,新 classes 的 backport(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android 使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。并确保使用子包从 org.threeten.bp 导入日期和时间 classes,例如 import org.threeten.bp.Duration;.

链接