Java小数精度问题

3

我有一个问题,需要将数字以长小数位数打印出来。 例如: 1/3 = 0.33333333333333333333333333333333333333 (非常长) 在使用C语言时, 我们可以使用 printf("%.30f", a); 但是我不知道在Java中该怎么做。


3
"Java十进制精度问题" 什么问题?你忘记问一个了。(请注意,"我不能做X"不是一个问题。) - Andrew Thompson
5个回答

9
在C或Java中,IEEE754二进制浮点数的精度不会太高。您最好使用BigDecimal进行算术运算,并使用特定的精度。例如:
import java.math.*;

public class Test {
    public static void main(String[] args) throws Exception {
        MathContext context = new MathContext(30);
        BigDecimal result = BigDecimal.ONE.divide(new BigDecimal(3), context);
        System.out.println(result.toPlainString());
    }
}

2
您可以使用System.out.printf (文档),但请注意,这仅适用于与在C中使用printf相同的目的:用于简单的调试/学习。当您需要工业级精度时,您需要BigDecimal

1
在Java中,你也可以使用printf,System.out.printf("...", a, b, ...)。

0

最简单的解决方案:

 double roundTwoDecimals(double d) {
            DecimalFormat twoDForm = new DecimalFormat("#.##");
        return Double.valueOf(twoDForm.format(d));
}

问题不好,但这段代码可行且是最简单的四舍五入小数的方法。 - shkschneider

0

Java中的double和C/C++中的double具有相同的精度。如果您想要打印30位小数,可以使用以下代码:

double d = 1.0/3;
System.out.println("%.30f", d);

然而,双精度浮点数在任何语言中都没有30位有效数字,所以会出现舍入误差。如果你需要在Java中保留30个小数位的精度,你需要使用BigDecimal。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接