Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/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中使用双值时如何获得高精度的答案?_Java - Fatal编程技术网

在Java中使用双值时如何获得高精度的答案?

在Java中使用双值时如何获得高精度的答案?,java,Java,我只是想了解在使用java时如何计算各种值。我从学习BigDecimal类开始,学习如何使用它进行高精度计算。我理解以下概念: BigDecimal xx = BigDecimal.valueOf(0.1); BigDecimal yy = BigDecimal.valueOf(0.2); System.out.printf("Number is: %s", xx.add(yy,new MathContext(30, RoundingMode.HALF_DOWN)).

我只是想了解在使用java时如何计算各种值。我从学习BigDecimal类开始,学习如何使用它进行高精度计算。我理解以下概念:

    BigDecimal xx = BigDecimal.valueOf(0.1);
    BigDecimal yy = BigDecimal.valueOf(0.2);


    System.out.printf("Number is: %s", xx.add(yy,new MathContext(30, RoundingMode.HALF_DOWN)).toString());
我得到了我期望的0.3的结果。我下一步尝试的仍然是在计算后显示很长的十进制值。我有两个例子

    BigDecimal xx = BigDecimal.valueOf(0.111111111111111111111111111111);
    BigDecimal yy = BigDecimal.valueOf(0.001111111111111111111111111111);


    System.out.printf("Number is: %s", xx.add(yy,new MathContext(30, RoundingMode.HALF_DOWN)).toString());
结果应该是0.112222…222,但结果是0.112222111

第二个例子是使用减法而不是加法。答案应该是0.11,但结果却是0.1099999999889

我想我的问题分为两部分。第一部分包括如何修复上述示例以获得正确答案,第二部分更一般。我最终想运行一些物理计算,我希望有非常高的精度,比如20-30位小数。我如何执行我的计算,以便保留我的答案,并用小的舍入问题和/或截断显示它们

BigDecimal xx=BigDecimal.valueOf(0.111111111111111111)

这里使用的是
double
文本,其精度有限,并且容易出现舍入错误

一直使用小数

BigDecimal xx=新的BigDecimal(“0.111111111111111111”)

当然,如果长数字不是硬编码到程序中的东西,而是浮点计算的结果,那么您已经存在舍入误差,必须接受它。转换为BigDecimal无法解决这个问题

我如何执行我的计算,以便保留我的答案,并用小的舍入问题和/或截断显示它们

除了打印时的舍入外,您所能做的不多。 例如“%.12d”

BigDecimal xx=BigDecimal.valueOf(0.111111111111111111)

这里使用的是
double
文本,其精度有限,并且容易出现舍入错误

一直使用小数

BigDecimal xx=新的BigDecimal(“0.111111111111111111”)

当然,如果长数字不是硬编码到程序中的东西,而是浮点计算的结果,那么您已经存在舍入误差,必须接受它。转换为BigDecimal无法解决这个问题

我如何执行我的计算,以便保留我的答案,并用小的舍入问题和/或截断显示它们

除了打印时的舍入外,您所能做的不多。 例如“%.12d”

我想我的问题分为两部分。第一部分包括如何修复上述示例以获得正确答案

使用接受字符串的构造函数

BigDecimal xx = new BigDecimal("0.111111111111111111111111111111");
BigDecimal yy = new BigDecimal("0.001111111111111111111111111111");
第二部分比较笼统。我最终想运行一些物理计算,我希望有非常高的精度,比如20-30位小数

你应该知道BigDecimal可以慢100倍,而在现实世界中,你几乎无法测量到15位数的精度。我会重新思考什么“物理”问题真正需要20-30位数的准确度

我想我的问题分为两部分。第一部分包括如何修复上述示例以获得正确答案

使用接受字符串的构造函数

BigDecimal xx = new BigDecimal("0.111111111111111111111111111111");
BigDecimal yy = new BigDecimal("0.001111111111111111111111111111");
第二部分比较笼统。我最终想运行一些物理计算,我希望有非常高的精度,比如20-30位小数


你应该知道BigDecimal可以慢100倍,而在现实世界中,你几乎无法测量到15位数的精度。我会重新思考什么“物理”问题真正需要20-30位数的准确度。

这是你问题的难点:

我最终想运行一些物理计算,我希望有非常高的精度,比如20-30位小数。我如何执行我的计算,以便保留我的答案,并用小的舍入问题和/或截断显示它们

对此没有简单的答案。这实际上取决于“物理计算”的性质。有些计算相对不会出错;i、 舍入误差对最终答案影响不大。在其他情况下(如混沌系统),错误会迅速累积,最终淹没答案

如何计算也很重要。例如,有一个基本的统计计算涉及到计算两个“平方和”(或类似的东西)之间的差。SoS值通常非常大,但差异很小。如果计算方法错误,则会得到不精确的差值。另一个影响计算的问题是矩阵求逆


值得一提的是,数学中有一个分支涉及数值计算和精度。这叫做数值分析。在“过去的好日子”中,它是计算机科学课程的一部分。

这是你问题的难点:

我最终想运行一些物理计算,我希望有非常高的精度,比如20-30位小数。我如何执行我的计算,以便保留我的答案,并用小的舍入问题和/或截断显示它们

对此没有简单的答案。这实际上取决于“物理计算”的性质。有些计算相对不会出错;i、 舍入误差对最终答案影响不大。在其他情况下(如混沌系统),错误会迅速累积,最终淹没答案

如何计算也很重要。例如,有一个基本的统计计算涉及到计算两个“平方和”之间的差