BigDecimal 上的循环分数到小数

Recurring fraction to decimal on BigDecimal

有很多方法可以将有理数转换为带有循环部分的小数(换句话说,10/3=3.(3),其中(3)表示它永远重复)。但这些仅在分子和分母为整数时才有效。如果分子或分母是双精度数,我们该怎么办?例如,我们如何找到

1/0.3 = 3.(3)

更新: 这有效,但仅适用于 int 数字。

http://www.programcreek.com/2014/03/leetcode-fraction-to-recurring-decimal-java/

让我们把问题分成两部分:

  • 1/0.3转换为N/M形式
  • N/M转换为a.b(c)形式

让我们将 0.3 转换为 M/N 形式 (得到 3/10)。

    String input = "123.456";
    String[] parts = input.split("\.");
    String whole = parts[0];
    String fraction = parts[1];

    int wholeInt = Integer.parseInt(whole);
    int fractionInt = Integer.parseInt(fraction);
    int multiplier = pow10(fraction.length());
    int n = wholeInt * multiplier + fractionInt;
    int m = multiplier;

    System.out.println(n + "/" + m);

我使用函数 pow10,它只是 returns 10 电源输入。

现在我们需要用 1 除以 10/3 很简单 N1/M1 除以 N2/M2 很简单 (N1*M2)/(N2*M1).

我们现在以 N/M 的形式得到结果(我们还需要通过将两部分除以 GCD(N, M 来对其进行归一化)

现在我们准备解决主要问题。

首先得到整个部分

    int whole = n/m;

然后求分数和重复部分

    int current = n%m;
    StringBuilder sb = new StringBuilder();
    List<Integer> controlSet = new ArrayList<>();
    while((!controlSet.contains(current))){
        int currentDigit = current *10 / m;
        sb.append(currentDigit);
        controlSet.add(current);
        current = current *10 - m * currentDigit;
    }
    String fraction = sb.toString().substring(0, controlSet.indexOf(current));
    String repeat = sb.toString().substring(controlSet.indexOf(current));

这里我们只是在循环中逐个获取结果。

主要技巧然后当我们遇到我们已经使用的 current 时数字开始重复。

现在你需要把所有的部分放在一起。实施 GCD(通过互联网进行大量实施)。