在Java中使用双值时如何获得高精度的答案?
我只是想了解在使用java时如何计算各种值。我从学习BigDecimal类开始,学习如何使用它进行高精度计算。我理解以下概念:在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)).
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、 舍入误差对最终答案影响不大。在其他情况下(如混沌系统),错误会迅速累积,最终淹没答案 如何计算也很重要。例如,有一个基本的统计计算涉及到计算两个“平方和”之间的差