数字精确计算工具
import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberFormat; import org.apache.commons.lang.StringUtils; public class DoubleUtils { private static final int DEF_DIV_SCALE = 10; /** * 6. * 提供精确的加法运算 7. * @param v1 被加数 8. * @param v2 加数 9. * @return 两个参数的和 * 10. */ public static int compareWeight(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); b1 = b1.setScale(4, BigDecimal.ROUND_HALF_UP); b2 = b2.setScale(4, BigDecimal.ROUND_HALF_UP); return b1.compareTo(b2); } public static int compareMoney(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); b1 = b1.setScale(2, BigDecimal.ROUND_HALF_UP); b2 = b2.setScale(2, BigDecimal.ROUND_HALF_UP); return b1.compareTo(b2); } public static double add(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.add(b2).doubleValue(); } /** * 18. * 提供精确的减法运算 19. * @param v1 被减数 20. * @param v2 减数 21. * @return * 两个参数的差 22. */ public static double substract(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.subtract(b2).doubleValue(); } /** * 30. * 提供精确的乘法运算 31. * @param v1 被乘数 32. * @param v2 乘数 33. * @return * 两个参数的积 34. */ public static double multiply(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.multiply(b2).doubleValue(); } /** * 42. * 提供(相对)精确的除法运算,当发生除不尽的情况时, 43. * 精确到小数点以后10位,以后的数字四舍五入. 44. * @param * v1 被除数 45. * @param v2 除数 46. * @return 两个参数的商 47. */ public static double divide(double v1, double v2) { return divide(v1, v2, DEF_DIV_SCALE); } /** * 53. * 提供(相对)精确的除法运算. 54. * 当发生除不尽的情况时,由scale参数指 定精度,以后的数字四舍五入. 55. * 56. * * @param v1 被除数 57. * @param v2 除数 58. * @param scale 表示需要精确到小数点以后几位 59. * * @return 两个参数的商 60. */ public static double divide(double v1, double v2, int scale) { if (scale < 0) { throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); } /** * 72. * 提供精确的小数位四舍五入处理 73. * @param v 需要四舍五入的数字 74. * @param scale 小数点后保留几位 * 75. * @return 四舍五入后的结果 76. */ public static double round(double v, int scale) { if (scale < 0) { throw new IllegalArgumentException( "The scale must be a positive integer or zero"); } BigDecimal b = new BigDecimal(Double.toString(v)); BigDecimal one = new BigDecimal("1"); return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); } public static double roundMoney(double v) { BigDecimal b = new BigDecimal(Double.toString(v)); BigDecimal one = new BigDecimal("1"); return b.divide(one, 2, BigDecimal.ROUND_HALF_UP).doubleValue(); } public static double roundWeight(double v) { BigDecimal b = new BigDecimal(Double.toString(v)); BigDecimal one = new BigDecimal("1"); return b.divide(one, 4, BigDecimal.ROUND_HALF_UP).doubleValue(); } public static String toMoney(double amount) { DecimalFormat df = new DecimalFormat("0.00"); return df.format(amount); } /** * 将以元为单位的金额转换成以分为单位的金额 * * @param amount * @return */ public static String toMinuteMoney(double amount) { if (compareMoney(amount, 0) == 0) return "0"; DecimalFormat df = new DecimalFormat("0"); return df.format(multiply(roundMoney(amount), 100)); } /** * 将以元为单位的金额转换成以分为单位的金额 * * @param amount * @return */ public static double toYuanMoney(double amount) { if (compareMoney(amount, 0) == 0) return amount; return roundMoney(divide(amount, 100)); } /** * 将以元为单位的金额转换成以分为单位的金额 * * @param amount * @return */ public static double toYuanMoney(String amount) { if (StringUtils.isBlank(amount)) return 0; return roundMoney(divide(Double.parseDouble(amount), 100)); } /** * 将放大了10000倍后的利率还原成原形 * * @param rate * @return */ public static double toRealRate(String rate) { if (StringUtils.isBlank(rate)) return 0; return round(divide(Double.parseDouble(rate), 10000), 5); } /** * 将放大了10000倍后的利率 * * @param rate * @return */ public static String toMaxRate(double rate) { if (compareMoney(rate, 0) == 0) return "0"; DecimalFormat df = new DecimalFormat("0"); return df.format(multiply(roundMoney(rate), 10000)); } public static void main(String[] args) { double str = DoubleUtils.toYuanMoney("1100007"); System.out.println(str); } /*** * 是否为正整数 */ public static boolean isPositiveInteger(double value) { long a = (long) value; if (a != value || a < 0) { return false; } return true; } /*** * 是否为正整数 */ public static boolean isPositiveInteger(String value) { double d = Double.parseDouble(value); long a = (long) d; if (a != d || a < 0) { return false; } return true; } }
相关推荐
### ArcGIS中计算面积与长度的公式解析 在地理信息系统(GIS)领域,尤其是使用ArcGIS软件时,准确计算矢量图层中的面积与长度是非常重要的。这些计算不仅有助于进行空间数据分析,还能够为土地管理、城市规划以及...
根据给定的信息,我们可以了解到这段代码是用来实现数值积分的不同方法,包括梯形公式、复化梯形公式、辛普森公式、复化辛普森公式、科特斯公式、复化科特斯公式、龙贝格公式以及高斯公式。下面将详细介绍这些公式的...
Simpson复化求积公式是数值积分领域中一种高效且精确的方法,它基于多项式插值的思想,通过近似函数的连续性来估算函数在指定区间内的积分。该公式通常用于解决那些不能直接求解或者解析积分过于复杂的数学问题。在...
通过理解牛顿-柯特斯公式的工作原理,以及如何在C++中实现它,我们可以有效地对给定数据进行插值,从而在没有精确函数表达式的情况下近似计算未知点的值。在实际应用中,这在数据分析、工程计算和科学模拟等领域都有...
"利用ScriptEngineManager实现字符串公式灵活计算的方法" 在开发中,我们可能会遇到很多不固定的公式计算,例如将Excel中的大量计算公式转换成Java语言进行实现。如果单纯地用Java的基本方法实现计算,我们就需要...
马钦公式是一种高效且精确的计算π的方法,它表达为: \[ \pi = 16\arctan\left(\frac{1}{5}\right) - 4\arctan\left(\frac{1}{239}\right) \] 首先,让我们理解马钦公式的背景和原理。圆周率π是一个无理数,表示...
在实际应用中,公式解析可能会用于财务结算系统,这里需要精确的计算结果。因此,浮点数的精度问题和错误处理也是不可忽视的。C++的`double`类型虽然通常足够精确,但在大运算量或特定情况下仍可能出现误差。 在...
Romberg求积公式是数值积分领域的一个重要方法,主要用于近似计算函数在一定区间上的定积分。该方法基于高斯辛普森法则和梯形法则,通过逐步提高精度,利用迭代的方式得到更精确的积分结果。VB(Visual Basic)是一...
复化辛甫生公式比基本的辛普森法则更为精确,因为它考虑了更多的子区间,从而提高了近似的准确性。 C++ 是一种通用的、面向对象的编程语言,被广泛应用于系统软件、应用软件、嵌入式系统以及游戏开发等领域。在本...
权重 \( w_j \) 是通过递归公式计算得到的,这个递归公式使得计算更加高效: \[ w_j = (-1)^{n-j} \frac{y_j}{\Delta_j} \] 其中,\( \Delta_j \) 是维萨罗德数组(Vandermonde determinant)的一部分,定义为: ...
为了精确计算两点间的距离,我们需要考虑地球的曲率。国际上通常采用WGS84(World Geodetic System 1984)坐标系统,这是一种全球统一的参考框架,用于定位地表的任何位置。 计算两点间距离最基础的方法是Haversine...
然而,精确地计算π需要复杂的数学理论和高级算法,对于初学者来说,通过数值积分方法是一个直观且实用的入门途径。 梯形法则是一种数值积分方法,它将一个区间分割成多个小的子区间,然后用一系列梯形的面积近似原...
3. **迭代和误差估计**:龙贝格公式的核心是通过迭代过程,结合不同阶的矩形和梯形规则的结果,来计算出更精确的积分值。每一步迭代都会使用前一步的结果,通过某种形式的线性组合(通常涉及高斯消元或矩阵乘法)来...
本题要求实现一个函数,用下列公式求cos的近似值,精确到最后一项的绝对值小于e: cos 函数接口定义: double funcos( double e, double x ); 其中用户传入的参数为误差上限e和自变量x;函数funcos应返回用给定...
在IT领域,尤其是在地理信息系统(GIS)或者导航应用中,计算地球上两点之间的距离是一个常见的...记住,这个算法虽然简单,但在实际应用中可能会有精度上的限制,更复杂的算法如Vincenty公式可以提供更高的精确度。
牛顿插值法是一种在离散数据点上构造连续函数的数学方法,广泛应用于数值分析、数据拟合和科学计算中。在C++编程环境中,我们可以利用牛顿插值法来...结合C++的强大功能,可以高效地处理大量数据,实现精确的数值计算。
2. **重力计算**:地球重力场的计算涉及到地球形状的考虑,椭球参数和倍角公式可以精确估算地球引力的影响。 3. **大地高程转换**:将大地高程转换为正常高或海拔高度时,需要考虑地球曲率,椭球参数和倍角公式在此...
首先,我们需要从键盘读取 \( r \) 和 \( s \) 的值,然后利用上述泰勒级数公式进行计算。在C语言中,这可以通过标准输入(stdio)库实现,使用`scanf`函数获取用户输入,`printf`函数输出结果。 ```c #include #...
以上是关于数值计算方法实验程序的主要知识点,包括牛顿插值法、拉格朗日插值法、梯形公式、辛普森公式及其自适应版本的介绍和具体实现。这些方法都是数值分析中的基础内容,广泛应用于科学计算和工程领域。
由于C++标准库中的`double`类型通常只能精确到约15位小数,因此需要使用扩展精度的浮点数库,如GMP(GNU Multiple Precision Arithmetic Library)或MPFR(Multiple Precision Floating-Point Reliable)来存储和...