如何格式化十进制数精度,如下所示:
double d = 1/3 返回 0.3333333333333333 并且数学上 3 无限重复
d = ((double)3)/ (double)41; 返回 0.07317073170731707,这里重复 07317

现在,要求格式化输出,如下所示
0.3333333333333333 应格式化为 0.(3),因为 3 重复。

同样 0.07317073170731707 应该被格式化为 0.(07317) 作为 07317 重复

我已经研究过 DecimalFormat 类,但我只能格式化精度数。

public static void main(String[] args) {
        DecimalFormat formatter = new DecimalFormat("#0.'('##')'");

        double d = ((double)1)/ (double)3;
        System.out.println("formatted "+formatter.format(d));
        System.out.println(d);


        d = ((double)1)/ (double)2;
        System.out.println("formatted "+formatter.format(d));
        System.out.println(d);


        d = ((double)3)/ (double)41;
        System.out.println("formatted "+formatter.format(d));
        System.out.println(d);

    }

输出:
formatted 0.33()
0.3333333333333333
formatted 0.5()
0.5
formatted 0.07()
0.07317073170731707

Java 中是否有任何内置类可以实现相同的目标?

最佳答案

正如评论中指出的那样,如果您只有一个字符串表示,首先,就无法判断它是否真的有一些重复部分,或者精度是否不够高。

但是,从您的示例中,您似乎实际上想要找到分数的重复部分,其中您知道分子和分母都是一个精确的整数。这不是什么难事;例如,您可以查看 https://codereview.stackexchange.com/questions/87522/decimal-expansion-of-a-rational-number

=== 更新 ===

我正在研究一个表示有理数的类,分子和分母为 BigIntegers(并假设尽可能减少)。在那里我实现了一种方法来生成表示为十进制字符串并提出以下内容:

public String toDecimalString() {

    var result = new StringBuilder();

    var remainders = new HashMap<BigInteger, Integer>();

    if(!isNonNegative()) result.append("-");
    var divAndRem = numerator.abs().divideAndRemainder(denominator);
    result.append(divAndRem[0].toString());

    if(isWholeNumber()) return result.toString();

    result.append(".");

    int currentPosition = result.length();
    remainders.put(divAndRem[1], currentPosition);

    while(!divAndRem[1].equals(BigInteger.ZERO)) {
        divAndRem = divAndRem[1].multiply(BigInteger.TEN).divideAndRemainder(denominator);
        result.append(divAndRem[0].toString());
        if(remainders.containsKey(divAndRem[1])) {
            int periodStart = remainders.get(divAndRem[1]);
            return result.substring(0, periodStart)+"["+result.substring(periodStart)+"]";
        }
        remainders.put(divAndRem[1], ++currentPosition);
    }

    return result.toString();

}

关于java - 如何格式化十进制数精度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54129458/

10-16 17:05