Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java BigDecimal上小数到小数的循环小数_Java_Math_Bigdecimal - Fatal编程技术网

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));