Java BigDecimal上小数到小数的循环小数
有很多方法可以将一个有理数转换成具有循环部分的十进制数(换句话说,Java BigDecimal上小数到小数的循环小数,java,math,bigdecimal,Java,Math,Bigdecimal,有很多方法可以将一个有理数转换成具有循环部分的十进制数(换句话说,10/3=3.(3),其中(3)表示它永远重复)。但只有当分子和分母是整数时,它们才起作用。如果分子或分母是双精度的,我们该怎么办?例如,我们如何才能找到它 1/0.3 = 3.(3) 更新: 这只适用于整数 让我们把问题分成两部分: 将1/0.3转换为N/M格式 将N/M转换为a.b(c)格式 让我们将0.3转换为M/N格式(这给了我们3/10) 我使用了函数pow10,它只返回10个电源输入 现在我们需要将1除以10/3
10/3=3.(3)
,其中(3)
表示它永远重复)。但只有当分子和分母是整数时,它们才起作用。如果分子或分母是双精度的,我们该怎么办?例如,我们如何才能找到它
1/0.3 = 3.(3)
更新:
这只适用于整数
让我们把问题分成两部分:
- 将
转换为1/0.3
格式N/M
- 将
转换为N/M
格式a.b(c)
0.3
转换为M/N
格式(这给了我们3/10
)
我使用了函数pow10
,它只返回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));
int电流=n%m;
StringBuilder sb=新的StringBuilder();
List controlSet=new ArrayList();
而((!controlSet.contains(current))){
int currentDigit=电流*10/m;
sb.追加(当前数字);
添加(当前);
电流=电流*10-m*电流数字;
}
字符串分数=sb.toString().substring(0,controlSet.indexOf(当前));
String repeat=sb.toString().substring(controlSet.indexOf(current));
在这里,我们只是将循环中得到的结果数字除以数字
然后,当我们遇到我们已经使用过的当前的时,主要技巧开始重复
现在,您需要将所有部分放在一起。实现GCD
(许多实现都是通过互联网实现的).您到底想要实现什么?显示您的输入和期望的输出。并向我们显示您在提问之前已尝试自己解决您的问题。我想进行1/0.3除法,而不是3除法。33333~希望检测重复出现的分数,并以类似3的粗糙形式显示。(3)这很简单。在进行除法之前,需要将0.3转换为3/10,然后使用有理数。澄清了problem@talex它可以是任何双精度值,如1/0.3452。因此,如果在除法之后我们检测到任何复发,则应将其标记。换句话说,如果除法结果为4.12121212,则应将其标记为4。(12)。如果结果为4.1212,则应保持该状态。另一个示例:如果您有一个决策5/0.2345或其他..且结果为0.11,则应显示0.11,但如果结果为0.1111111,则应显示0。(1)。希望这能澄清问题。int denominator=BigDecimal.TEN.pow(bd.scale()).intValue();int nominator=bd.unscaledValue().intValue();System.out.println(nominator+“/”+分母);
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));