获取一个数字的前N位数字

5

我正在编写一个小程序,用于显示一个数的阶乘。

当我输入数字20时,结果为2432902008176640000。

请问如何在Java中限制小数位数。

例如,数字2432902008176640000应该显示为2432(限制为4位)。

谢谢您的帮助。


使用string.valueof和substring函数。 - Yanki Twizzy
请查看以下链接:https://dev59.com/N2ox5IYBdhLWcg3w6odf - PaolaG
@用户,这个数据类型是什么? - Sai Avinash
你可以查看DecimalFormat类... - Not a bug
设施编号长度是固定的还是可以更改的? - Shekhar Khairnar
6个回答

9
以下内容可能会满足您的要求,如果您想要做的正是我认为您想要做的事情。
long n = 2432902008176640000L; // original number
while (n > 9999) {
   // while "more than 4 digits", "throw out last digit"
   n = n / 10;
}
// now, n = 2432

并且 这里有一个演示.


注释:

  1. long 只能表示最大值为9223372036854775807的数(仅大约是给定数字的4倍),在处理更大的数字时,您需要切换到 BigInteger 或类似技术。相同的技术可以使用,更新语法差异。

  2. 正如 fge 指出的那样,此代码在负数上无法工作;可以通过更改条件(即 n < -9999)或先获取 n 的绝对值(然后在最后恢复操作)来解决此问题。

  3. 如 yinqiwen 的答案中所做的那样,n > 9999 可以替换为 n >= (long)Math.pow(10, N)(最好使用一个临时变量),其中 N 表示小数位数。


谢谢user2864740!这是我的问题的解决方案 :-) - user2773145
注意,如果数字为负数,这将失败 ;) - fge

3

之前一些带有循环的答案的时间复杂度为O(n)。这里提供一种常数时间复杂度的解决方案:

long num = 2432902008176640000L;
int n = 4;
long first_n = (long) (num / Math.pow(10, Math.floor(Math.log10(num)) - n + 1));

3

尝试这个,可能会有帮助:

Long n = 2432902008176640000;
String num = String.valueOf(n);
num = num.subString(0, 4);
n = Long.valueOf(num);

3
用限制替换N。
long v = 2432902008176640000L; 
long x = (long) Math.pow(10, N);

while(v >= x)
{
   v /= 10;
}

解决边缘情况的修复。 - yinqiwen

2

我假设你是指一个数的阶乘。 只需将该数字转换为字符串,然后使用子字符串方法仅获取前4位数字。 fact是阶乘值。

    String result_4_str=(fact+"").substring(0, 4);
    long result_4 = Long.parseLong(result_4_str);
    System.out.println(result_4);

1
你可以尝试。
long number = 2432902008176640000L ;
String numberStr = String.valueOf(number);      
if(numberStr.length()>=4){
    System.out.println(numberStr.substring(0, 4));      
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接