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
(通过互联网进行大量实施)。
有很多方法可以将有理数转换为带有循环部分的小数(换句话说,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
(通过互联网进行大量实施)。