我试图在一个数字中找到尾随数字的零,这是我的代码:
public class TrailingZeroes {
public static void bruteForce(int num){ //25
double fact = num; //25
int numOfZeroes = 0;
for(int i= num - 1; i > 1; i--){
fact = fact * (i);
}
System.out.printf("Fact: %.0f\n",fact); //15511210043330984000000000
while(fact % 10 == 0){
fact = fact / 10;
double factRem = fact % 10;
System.out.printf("Fact/10: %.0f\n",fact); //1551121004333098400000000
System.out.printf("FactRem: %.0f\n",factRem); // 2?
numOfZeroes++;
}
System.out.println("Nnumber of zeroes "+ numOfZeroes); //1
}
}
Run Code Online (Sandbox Code Playgroud)
正如你可以看到的事实%10
的float和double在Java原始类型浮点数字,其中该数字存储为部分和指数的二进制表示.
更具体地说,诸如类型的双精度浮点值double是64位值,其中:
组合这些部分以产生double值的表示.
有关如何在Java中处理浮点值的详细说明,请参见部分4.2.3: Java语言规范的浮点类型,格式和值.
的byte,char,int,long类型为[定点] [6]的数字,这是数字的精确representions.与定点数不同,浮点数有时会(可以安全地假定"大部分时间")不能返回数字的精确表示.这就是为什么你最终得到11.399999999999的结果5.6 + 5.8.
当需要精确的值(例如1.5或150.1005)时,您将需要使用其中一种定点类型,它们能够准确地表示数字.
正如已经多次提到的那样,Java有一个BigDecimal类可以处理非常大的数字和非常小的数字.
public static void bruteForce(int num) { //25
double fact = num;
// precision was lost on high i
for (int i = num - 1; i > 1; i--)
fact *= i;
String str = String.format("%.0f", fact); //15511210043330984000000000
System.out.println(str);
int i = str.length() - 1;
int numOfZeroes = 0;
while (str.charAt(i--) == '0')
numOfZeroes++;
System.out.println("Number of zeroes " + numOfZeroes); //9
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
74 次 |
| 最近记录: |