在BigDecimal上重复的小数到小数

时间:2016-09-23 14:53:25

标签: java math 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 :(得分:0)

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

  • 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,它只返回10个电源输入。

现在我们需要将1除以10/3 这很容易N1/M1除以N2/M2它只是(N1*M2)/(N2*M1)。< / p>

我们现在以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(许多通过互联网实施)。