ApFloat http://www.apfloat.org/是一个C / C ++ / Java数学库,可以计算许多trascendental操作,如平方根,取幂,对数,三角/双曲函数,π的数值等,具有任意精度的数字,BigDecimal
Java类中没有。
我们都知道4/3的扩展是无限的:1.333 ....所以当我们试图以任何特定的精度得到它时,无论多长时间,都会有信息丢失,但四舍五入模式也很重要,即
不幸的是,在执行这样的操作时不能指定舍入模式,可能是因为“由于在实现中可能发生的不同类型的舍入错误,对于任何方法都没有给出例如单调性的保证。”
但是,有一种方法可以使用特定的精度和舍入模式{Apler]来舍入ApFloat数字http://www.apfloat.org/apfloat_java/docs/org/apfloat/ApfloatMath.html#round-org.apfloat.Apfloat-long-java.math.RoundingMode-
一个简单的解决方案可能是以额外的精度计算操作,然后使用原始精度和所需的舍入模式舍入结果,如下例所示:
// Trying to get the square root of 2
// with precision of 10
// and different roundig modes
Apfloat two = new Apfloat(2, 15); // precision is 15, not 10
// result: 2
Apfloat sqrt = ApfloatMath.sqrt(two);
// result: 1.41421356237309
ApfloatMath.round(sqrt, 10, RoundingMode.FLOOR);
// result: 1.414213562
ApfloatMath.round(sqrt, 10, RoundingMode.CEILING);
// result: 1.414213563
问题是:
答案 0 :(得分:0)
在这里,我希望有所帮助
public static void main(String[] args) {
Apfloat two = new Apfloat(2, 15); // Line 1: If you want precision be 10, than you can´t get result 1.41421356237309 on Line 4, because result have more than 10 numbers after . (decimal dot)
// you can add new Apfloat variable with precision 15 for line 4 and for line 5,6 with precision 10
System.out.print("Line2: Expected: 2 Result:" + two + "\n"); // Line 2:
Apfloat sqrt = ApfloatMath.sqrt(two); // Line 3:
System.out.print("Line4: Expected: 1.41421356237309 Result:" + sqrt + "\n"); // Line 4:
System.out.print("Line5: Expected: 1.414213562 Result:" + ApfloatMath.round(sqrt, 10, RoundingMode.FLOOR) + "\n"); // Line 5:
System.out.print("Line6: Expected: 1.414213563 Result:" + ApfloatMath.round(sqrt, 10, RoundingMode.CEILING) + "\n"); // Line 6:
}
<强>结果:强>