gpt4 book ai didi

java - 为什么模数很大似乎在 Java 中给出了错误的答案

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:37:37 25 4
gpt4 key购买 nike

我试图在数字中找到尾随零的数字,这是我的代码:

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

}
}

事实如你所见%10

最佳答案

您非法使用浮点数据类型。

Java 中的floatdouble 基本类型是floating point数字,其中数字存储为分数和指数的二进制表示。

更具体地说,一个 double-precision double 类型的浮点值是 64 位值,其中:

  • 1 位表示符号(正或负)。
  • 11 位的指数。
  • 有效数字为 52 位(小数部分为二进制)。

这些部分组合起来产生一个值的double表示。

有关如何在 Java 中处理浮点值的详细说明,请参阅 Section 4.2.3: Floating-Point Types, Formats, and Values Java 语言规范。

bytecharintlong类型是[定点][6]数,它们是数字的精确表示。与定点数不同, float 有时(安全地假设“大部分时间”)无法返回数字的精确表示。这就是为什么您最终得到 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
}

关于java - 为什么模数很大似乎在 Java 中给出了错误的答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54607038/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com