【问题标题】:Get a less specific number - from another number获取一个不太具体的数字 - 从另一个数字
【发布时间】:2012-08-22 07:30:43
【问题描述】:

对,抱歉,我想不出用 Google 搜索的正确词语。所以我得问问。

我有一个long (System.currentTimeMillis())

让我们说

3453646345345345

我想删除最后六位(或其他数量的)数字,我想我可以通过某种位移来做到这一点?

所以我最终会得到

3453646345

编辑

我想在一个时间框内获得System.currentTimeMillis(),所以如果我询问时间然后在 29 秒后再次询问,它将返回相同的数字,但如果我在 31 秒后询问,它将返回不同的号码。 30 秒时间框可配置。

【问题讨论】:

    标签: java math numbers bit-manipulation


    【解决方案1】:

    您只需将其除以 1M long shorter = System.currentTimeMillis() / 1000000L;

    【讨论】:

    • 虽然这不是很可配置(我说的是'或其他数量')
    • @Blundell 您可以根据需要以任何方式配置除数。你能举例说明你的意思吗?
    • 所以,放入一个带有int numbersToRemove 参数的方法并使用System.currentTimeMillis() / (long)Math.pow(10, numbersToRemove)
    • @Keppil 你应该把它作为答案!
    【解决方案2】:

    要以@Yob 的回答为基础,您可以通过创建如下方法来配置要删除的位数:

    public long removeDigits(long number, int digitsToRemove) {
        return number / (long)Math.pow(10, digitsToRemove);
    }
    

    【讨论】:

    • 所以基本上你将其转换为分数并取尾数。但是由于浮点运算,我们不会丢失一些位吗?
    • @Geek:哪个浮点运算?计算 10 的 int 次方不会导致我们失去任何精度,然后我们会进行长除以去除最右边的数字。
    • 长除法就是我说的浮点运算
    • @Geek:目的是去掉数字,所以这肯定会导致比特丢失。
    【解决方案3】:

    根据您想要做什么(我假设以 10 为基数),您可以这样做:

    int64_t radix = 1000000; // or some other power of 10
    
    x -= x%radix; // last 6 decimal digits are now 0
                  // e.g: from 3453646345345345 to 3453646345000000
    

    或者这个(如上一个答案):

    x /= radix; // last 6 decimal digits are gone, the result rounded down
                // e.g: from 3453646345345345 to 3453646345
    

    对编辑的回应

    出于您的目的,您可以将模数示例中的 radix 更改为 30000:

    int64_t timeInterval = 30000;
    displayTime = actualTime - (actualTime % timeInterval);
    

    displayTimeactualTime 以毫秒为单位。在这种情况下,displayTime 将具有 30 秒的(向下舍入)粒度,同时保持毫秒单位。

    要获得向上的粒度,您可以执行以下操作:

    int64_t timeInterval = 30000;
    int64_t modulus = actualTime % timeInterval;
    displayTime = actualTime - modulus + (modulus?timeInterval:0);
    

    不过,根据您的要求,您似乎只想每隔几个刻度更新一次显示值。以下内容也将起作用:

    if((actualTime - displayTime) >= timeInterval){
        displayTime = actualTime - (actualTime % timeInterval);
    }
    

    请原谅 C 整数类型,我只是希望对我使用的整数的宽度保持明确:P。

    【讨论】:

      猜你喜欢
      • 2021-12-09
      • 1970-01-01
      • 1970-01-01
      • 2015-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-31
      • 1970-01-01
      相关资源
      最近更新 更多