简单的数学总是返回0

时间:2018-03-15 21:13:52

标签: android math return return-value milliseconds

在我的应用程序中,我有一个以毫秒为单位的时间(介于0到60000之间)除以某个值(在当前示例中为60000)然后,我将其乘以100。

但是,将答案打印到日志中时,它始终返回0.

这是我的代码:

lag

2 个答案:

答案 0 :(得分:1)

The answer by user3818491为您提供了正确的解决方案。我想贡献现代版本。不要使用原始数字作为持续时间,使用Duration类java.time(现代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格式,就像这样,如果需要,您将学会轻松阅读。)

在Java 9中引入了Duration.dividedBy(Duration)方法。对于早期的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内置。
  • 在Java 6和7中获取ThreeTen Backport,新类的后端端口(适用于JSR 310的ThreeTen;请参阅底部的链接)。
  • On(较旧)Android使用Android版的ThreeTen Backport。它被称为ThreeTenABP。并确保从org.threeten.bp导入包含子包的日期和时间类,例如import org.threeten.bp.Duration;

链接

答案 1 :(得分:0)

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

你需要在做divsion之前转换为float或double ((double)timeLeftInMillis / activityDuration) * 100)