Java 从另一个号码获取不太具体的号码

Java 从另一个号码获取不太具体的号码,java,math,numbers,bit-manipulation,Java,Math,Numbers,Bit Manipulation,对,对不起,我想不出正确的词来谷歌这个。所以我得问问 我有一个长的(System.currentTimeMillis()) 比方说 3453646345345 我想删除最后六位(或其他数字),我想我可以做一些位移位吗 所以我会以 3453646345 编辑 我想在一个时间框内获取System.currentTimeMillis(),因此如果我询问时间,那么29秒后再次询问,它将返回相同的数字,但如果我在31秒后询问,它将返回不同的数字。30秒的时间框是可配置的。您只需将其除以1Mlong sho

对,对不起,我想不出正确的词来谷歌这个。所以我得问问

我有一个长的(
System.currentTimeMillis()

比方说

3453646345345

我想删除最后六位(或其他数字),我想我可以做一些位移位吗

所以我会以

3453646345

编辑


我想在一个时间框内获取
System.currentTimeMillis()
,因此如果我询问时间,那么29秒后再次询问,它将返回相同的数字,但如果我在31秒后询问,它将返回不同的数字。30秒的时间框是可配置的。

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

根据您想要做的事情(我假设在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
或者这个(如前一个答案所示):

对编辑的响应 出于您的目的,您可以将模数示例中的基数更改为30000:

int64_t timeInterval = 30000;
displayTime = actualTime - (actualTime % timeInterval);
其中
显示时间
实际时间
以毫秒为单位<代码>显示时间
在这种情况下,粒度(向下舍入)为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.

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

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

但是这不是很可配置的(我说的是'or other number of')@Blundell您可以按任何方式配置除数。你能举例说明你的意思吗?那么,把一个带有
int numbersToRemove
参数的方法放进去,然后使用
System.currentTimeMillis()/(long)Math.pow(10,numbersToRemove)
@Keppil你应该把它作为答案!所以基本上你要把它转换成分数,然后取尾数。但是因为浮点运算,我们不会丢失一些位吗?@Geek:哪个浮点运算?计算10到整数的幂不会使我们失去任何精度,然后我们进行长除法以去除最右边的数字。长除法就是我刚才说的浮点运算about@Geek:目的是去除数字,因此这肯定会导致位丢失。
public long removeDigits(long number, int digitsToRemove) {
    return number / (long)Math.pow(10, digitsToRemove);
}