Java 中进行复杂计算的方法
methods for undertaking complex calculations in Java
我必须在 Java 应用程序中实现一些相对复杂的公式。这些公式的输入包括多达 30 个左右的变量。其中一些自然形式的变量是整数,一些是精度为小数点后 3 到 4 位的实数。我正在为函数使用 commons-math,但我想知道精度和便利性:
在传递给公式方法之前,最好将所有变量整数转换为 Double。这样在公式中就有了一致性,其次我可以安全地使用 Double 来获得 3 到 4 dp 的精度吗?在 Java 中是否有用于实现复杂数学的 "best practice"?
无需将变量 Integers
转换为 Double
。将所有变量初始化为 Double
,因为如果您在公式中有一部分只是除以 2 Integers
并添加到 30 个变量的结果中,那么它将丢失小数位的值。因此,最好将 Double
用于数学目的,其中小数位对于产生正确答案很重要。
对于带精度的浮点计算...我建议使用 BigDecimal。因为 Double 和 Float 以丢失精度而闻名。
以下片段说明了这个问题。
System.out.println( 0.1f + 0.1f + 0.1f + 0.1f + 0.1f + 0.1f + 0.1f + 0.1f + 0.1f + 0.1f );
System.out.println( 0.1d + 0.1d + 0.1d + 0.1d + 0.1d + 0.1d + 0.1d + 0.1d + 0.1d + 0.1d );
1.0000001
0.9999999999999999
将0.1乘以10次,你期望得到1,但不是。
我必须在 Java 应用程序中实现一些相对复杂的公式。这些公式的输入包括多达 30 个左右的变量。其中一些自然形式的变量是整数,一些是精度为小数点后 3 到 4 位的实数。我正在为函数使用 commons-math,但我想知道精度和便利性:
在传递给公式方法之前,最好将所有变量整数转换为 Double。这样在公式中就有了一致性,其次我可以安全地使用 Double 来获得 3 到 4 dp 的精度吗?在 Java 中是否有用于实现复杂数学的 "best practice"?
无需将变量 Integers
转换为 Double
。将所有变量初始化为 Double
,因为如果您在公式中有一部分只是除以 2 Integers
并添加到 30 个变量的结果中,那么它将丢失小数位的值。因此,最好将 Double
用于数学目的,其中小数位对于产生正确答案很重要。
对于带精度的浮点计算...我建议使用 BigDecimal。因为 Double 和 Float 以丢失精度而闻名。 以下片段说明了这个问题。
System.out.println( 0.1f + 0.1f + 0.1f + 0.1f + 0.1f + 0.1f + 0.1f + 0.1f + 0.1f + 0.1f );
System.out.println( 0.1d + 0.1d + 0.1d + 0.1d + 0.1d + 0.1d + 0.1d + 0.1d + 0.1d + 0.1d );
1.0000001
0.9999999999999999
将0.1乘以10次,你期望得到1,但不是。