import java.math.BigDecimal;
public class MathExtend {
//默认除法运算精度
private static final int DEFAULT_DIV_SCALE = 10;
/**
* 提供精确的加法运算。
*
* @param v1
* @param v2
* @return 两个参数的和
*/
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();
}
/**
* 提供精确的加法运算
*
* @param v1
* @param v2
* @return 两个参数数学加和,以字符串格式返回
*/
public static String add(String v1, String v2)
{
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.add(b2).toString();
}
/**
* 提供精确的减法运算。
*
* @param v1
* @param v2
* @return 两个参数的差
*/
public static double subtract(double v1, double v2)
{
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.subtract(b2).doubleValue();
}
/**
* 提供精确的减法运算
*
* @param v1
* @param v2
* @return 两个参数数学差,以字符串格式返回
*/
public static String subtract(String v1, String v2)
{
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.subtract(b2).toString();
}
/**
* 提供精确的乘法运算。
*
* @param v1
* @param v2
* @return 两个参数的积
*/
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();
}
/**
* 提供精确的乘法运算
*
* @param v1
* @param v2
* @return 两个参数的数学积,以字符串格式返回
*/
public static String multiply(String v1, String v2)
{
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.multiply(b2).toString();
}
/**
* 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到
* <p/>
* 小数点以后10位,以后的数字四舍五入,舍入模式采用ROUND_HALF_EVEN
*
* @param v1
* @param v2
* @return 两个参数的商
*/
public static double divide(double v1, double v2)
{
return divide(v1, v2, DEFAULT_DIV_SCALE);
}
/**
* 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
* <p/>
* 定精度,以后的数字四舍五入。舍入模式采用ROUND_HALF_EVEN
*
* @param v1
* @param v2
* @param scale 表示需要精确到小数点以后几位。
* @return 两个参数的商
*/
public static double divide(double v1, double v2, int scale)
{
return divide(v1, v2, scale, BigDecimal.ROUND_HALF_EVEN);
}
/**
* 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
* <p/>
* 定精度,以后的数字四舍五入。舍入模式采用用户指定舍入模式
*
* @param v1
* @param v2
* @param scale 表示需要精确到小数点以后几位
* @param round_mode 表示用户指定的舍入模式
* @return 两个参数的商
*/
public static double divide(double v1, double v2, int scale, int round_mode) {
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, round_mode).doubleValue();
}
/**
* 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到
* <p/>
* 小数点以后10位,以后的数字四舍五入,舍入模式采用ROUND_HALF_EVEN
*
* @param v1
* @param v2
* @return 两个参数的商,以字符串格式返回
*/
public static String divide(String v1, String v2)
{
return divide(v1, v2, DEFAULT_DIV_SCALE);
}
/**
* 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
* <p/>
* 定精度,以后的数字四舍五入。舍入模式采用ROUND_HALF_EVEN
*
* @param v1
* @param v2
* @param scale 表示需要精确到小数点以后几位
* @return 两个参数的商,以字符串格式返回
*/
public static String divide(String v1, String v2, int scale)
{
return divide(v1, v2, DEFAULT_DIV_SCALE, BigDecimal.ROUND_HALF_EVEN);
}
/**
* 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
* <p/>
* 定精度,以后的数字四舍五入。舍入模式采用用户指定舍入模式
*
* @param v1
* @param v2
* @param scale 表示需要精确到小数点以后几位
* @param round_mode 表示用户指定的舍入模式
* @return 两个参数的商,以字符串格式返回
*/
public static String divide(String v1, String v2, int scale, int round_mode)
{
if (scale < 0)
{
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.divide(b2, scale, round_mode).toString();
}
/**
* 提供精确的小数位四舍五入处理,舍入模式采用ROUND_HALF_EVEN
*
* @param v 需要四舍五入的数字
* @param scale 小数点后保留几位
* @return 四舍五入后的结果
*/
public static double round(double v, int scale)
{
return round(v, scale, BigDecimal.ROUND_HALF_EVEN);
}
/**
* 提供精确的小数位四舍五入处理
*
* @param v 需要四舍五入的数字
* @param scale 小数点后保留几位
* @param round_mode 指定的舍入模式
* @return 四舍五入后的结果
*/
public static double round(double v, int scale, int round_mode)
{
if (scale < 0)
{
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
BigDecimal b = new BigDecimal(Double.toString(v));
return b.setScale(scale, round_mode).doubleValue();
}
/**
* 提供精确的小数位四舍五入处理,舍入模式采用ROUND_HALF_EVEN
*
* @param v 需要四舍五入的数字
* @param scale 小数点后保留几位
* @return 四舍五入后的结果,以字符串格式返回
*/
public static String round(String v, int scale)
{
return round(v, scale, BigDecimal.ROUND_HALF_EVEN);
}
/**
* 提供精确的小数位四舍五入处理
*
* @param v 需要四舍五入的数字
* @param scale 小数点后保留几位
* @param round_mode 指定的舍入模式
* @return 四舍五入后的结果,以字符串格式返回
*/
public static String round(String v, int scale, int round_mode)
{
if (scale < 0)
{
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
BigDecimal b = new BigDecimal(v);
return b.setScale(scale, round_mode).toString();
}
}
分享到:
相关推荐
总结一下,Java中的浮点数精确计算主要是通过`java.math.BigDecimal`类来实现的,而"Java实现的浮点类的精确计算"则可能是一个自定义工具类,封装了`BigDecimal`的操作,以提供方便、准确的浮点数计算服务。...
总之,虽然Java的浮点数类型在日常编程中方便、易用,但在要求精确计算的领域,开发者必须意识到它们的局限性,并采用Decimal和BigDecimal类型来确保数值计算的精确无误。通过合理使用这些高精度数值类型,并掌握其...
在本实验中,我们将深入探讨Java编程语言在实现计算方法中的应用。计算方法是计算机科学与数学的一个交叉领域,主要用于解决各种数值问题。这个实验由江科大的费小勇教授设计,旨在帮助学习者理解并掌握如何用Java来...
描述中提到的链接指向了一个具体的博客文章,虽然内容无法在此提供,但我们可以根据常规的Java精确计算方法来展开讨论。 通常,Java中的`double`和`float`类型在进行数学运算时由于二进制浮点数的表示方式,会存在...
### Java中实现浮点数的精确计算 在Java编程中,使用`float`和`double`类型...通过上述方法,可以在Java中实现浮点数的精确计算,解决因精度问题导致的误差。在实际开发中,根据应用场景选择合适的解决方案非常重要。
Java代码可能会封装这些复杂的计算逻辑在一个静态方法或者工具类中,提供方便的接口供其他部分调用。 接着,我们转向C++实现。虽然C++标准库没有像Java那样提供强大的日期时间API,但开发者可以使用第三方库,如`...
在金融和会计领域,计算投资的内部收益率是评估投资回报的重要方法之一。XIRR(Extended Internal Rate of Return,扩展内部收益率)是Excel等电子表格软件中一个特定的函数,用于计算非定期现金流的内部收益率。...
本文将深入探讨Java中实现数值计算的方法、工具和最佳实践。 首先,我们要理解Java的基础数据类型,包括整型(byte, short, int, long)、浮点型(float, double)以及它们在数值计算中的应用。Java的数据类型提供...
3. **自定义公式或库**:由于Java标准库并未内置24节气的计算方法,开发者通常需要自定义算法或使用第三方库。算法可能涉及天文计算,如太阳黄经与公历日期的转换。例如,可以利用太阳黄经和地球公转周期(回归年)...
本实验课程基于Java编程语言,旨在帮助学生理解和掌握数值计算方法,并通过实践加深对理论知识的运用。 首先,数值计算涉及一系列算法,如线性代数中的求解线性方程组、数值微积分中的数值积分和微分、数值优化中的...
Java数值计算算法编程是计算机科学中的一个重要领域,它涉及到如何使用Java语言进行高效且精确的数学运算。在Java中,数值计算涵盖了广泛的算法和技术,包括基本的算术运算、复杂数学函数、线性代数、微积分、概率...
在Java编程语言中,将时间转换为传统的生辰八字是一项有趣且富有挑战性的任务。生辰八字是中国传统文化中用于预测命运的一种方式,它基于农历日期和时间,包括年、月、日、时四个部分,每个部分对应一个天干地支。在...
- **JOL (Java Object Layout)**:由Azul Systems开发的轻量级库,通过反射和JNI技术来计算对象的精确大小。 6. **源码分析**:通过阅读JVM的源码,如OpenJDK,可以更深入地理解对象是如何在内存中布局的。 7. **...
- `java.util.Duration`类代表两个日期或时刻之间的时间间隔,可以精确到纳秒,通常用于计算两个时间点之间的差值。 - `java.time.Period`类则用于表示日期之间的间隔,如年、月、日。 6. **线程安全的计时器** ...
通过这个项目,开发者可以学习到如何在Java中创建图形用户界面(GUI)以及如何处理用户输入和执行相应的计算操作。 二、核心技术 1. Java Swing:作为Java的GUI库,Swing提供了丰富的组件,如按钮、文本框、标签等...
因此,这种方法对于短期统计和简单示例是有效的,但在复杂或长期运行的系统中,可能需要更精确的方法来跟踪对象的生命周期。 总的来说,使用静态成员变量来计算Java程序中实例化的对象数量是一种实用的技术,可以...
2. **天文计算**:对于精确计算,我们需要理解太阳黄经(太阳在黄道上的度数)的概念。二十四节气对应着太阳黄经的特定值,如春分对应0度,夏至对应90度,以此类推。可以利用天文公式来计算给定日期的太阳黄经。 3....
本文将深入探讨如何在Java中计算字符串所占用的内存空间,包括现有的计算方法、其局限性以及具体的计算公式。 #### 计算内存占用的传统方法及其局限性 在Java中,直接获取一个对象所占用的内存大小并非易事。常见...