package com.saicfc.saicifx3.util;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.regex.Pattern;
/**
* 计算辅助类(默认运算精度:10)
*
* @author ShenHuaJie
* @since 2011-11-08
*/
public class MathUtils {
// 默认运算精度
private static int DEF_SCALE = 10;
/**
* 提供数据类型转换为BigDecimal
*
* @param object
* 原始数据
* @return BigDecimal
*/
public static BigDecimal bigDecimal(Object object) {
if (object == null) {
throw new NullPointerException();
}
BigDecimal result;
try {
result = new BigDecimal(String.valueOf(object).replaceAll(",", ""));
} catch (NumberFormatException e) {
throw new NumberFormatException("Please give me a numeral.Not " + object);
}
return result;
}
/**
* 提供(相对)精确的加法运算。
*
* @param num1
* 被加数
* @param num2
* 加数
* @return 两个参数的和
*/
public static Double add(Object num1, Object num2) {
BigDecimal result = bigDecimal(num1).add(bigDecimal(num2));
return result.setScale(DEF_SCALE, BigDecimal.ROUND_HALF_UP).doubleValue();
}
/**
* 提供(相对)精确的减法运算。
*
* @param num1
* 被减数
* @param num2
* 减数
* @return 两个参数的差
*/
public static Double subtract(Object num1, Object num2) {
BigDecimal result = bigDecimal(num1).subtract(bigDecimal(num2));
return result.setScale(DEF_SCALE, BigDecimal.ROUND_HALF_UP).doubleValue();
}
/**
* 提供(相对)精确的乘法运算。
*
* @param num1
* 被乘数
* @param num2
* 乘数
* @return 两个参数的积
*/
public static Double multiply(Object num1, Object num2) {
BigDecimal result = bigDecimal(num1).multiply(bigDecimal(num2));
return result.setScale(DEF_SCALE, BigDecimal.ROUND_HALF_UP).doubleValue();
}
/**
* 提供(相对)精确的除法运算,当发生除不尽的情况时,精度为10位,以后的数字四舍五入。
*
* @param num1
* 被除数
* @param num2
* 除数
* @return 两个参数的商
*/
public static Double divide(Object num1, Object num2) {
return divide(num1, num2, DEF_SCALE);
}
/**
* 提供(相对)精确的除法运算。 当发生除不尽的情况时,由scale参数指定精度,以后的数字四舍五入。
*
* @param num1
* 被除数
* @param num2
* 除数
* @param scale
* 表示表示需要精确到小数点以后几位。
* @return 两个参数的商
*/
public static Double divide(Object num1, Object num2, Integer scale) {
if (scale == null) {
scale = DEF_SCALE;
}
num2 = num2 == null || Math.abs(new Double(num2.toString())) == 0 ? 1 : num2;
if (scale < 0) {
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
BigDecimal result = bigDecimal(num1).divide(bigDecimal(num2), scale,
BigDecimal.ROUND_HALF_UP);
return result.doubleValue();
}
/**
* 提供精确的小数位四舍五入处理。
*
* @param num
* 需要四舍五入的数字
* @param scale
* 小数点后保留几位
* @return 四舍五入后的结果
*/
public static Double round(Object num, int scale) {
if (scale < 0) {
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
BigDecimal result = bigDecimal(num)
.divide(bigDecimal("1"), scale, BigDecimal.ROUND_HALF_UP);
return result.doubleValue();
}
/**
* 获取start到end区间的随机数,不包含start+end
*
* @param start
* @param end
* @return
*/
public static BigDecimal getRandom(int start, int end) {
return new BigDecimal(start + Math.random() * end);
}
/**
* 格式化
* @param obj
* @param pattern
* @return
*/
public static String format(Object obj, String pattern) {
if (obj == null) {
return null;
}
if (pattern == null || "".equals(pattern)) {
pattern = "#";
}
DecimalFormat format = new DecimalFormat(pattern);
return format.format(bigDecimal(obj));
}
/**
* 格式化金额
* 如:,3,123.00"------>3123.00
* @param amount
* @return
*/
public static String formatAmount(String str) {
if (str != null) {
str = str.replaceAll(",", "").trim();
}
return str;
}
/**
* 格式化金额
* 如:3123.00------> "3,123.00"
* @param str
* @return
*/
public static String formatNumber(String str) {
if (str != null) {
Double strDouble = Double.parseDouble(str.replaceAll(",", "").trim());
DecimalFormat dFormat = new DecimalFormat("#,##0.00");
str = dFormat.format(strDouble);
}
return str;
}
/**
* 格式化金额
* 如 8888888.88--------->¥8,888,888.88
* @param str
* @return
*/
public static String formatAmountString(String amount) {
if (amount != null) {
Double strDouble = Double.parseDouble(amount.replaceAll(",", "").trim());
NumberFormat nFormat = NumberFormat.getCurrencyInstance();
amount = nFormat.format(strDouble);
}
return amount;
}
/**
* 格式化汇率
* @param exrate
* 如:'0.2----->0.200000'
* @return
*/
public static String formatExRate(String exrate) {
if (exrate != null) {
Double strDouble = Double.parseDouble(exrate.replaceAll(",", "").trim());
DecimalFormat dFormat = new DecimalFormat("#,##0.00000000");
exrate = dFormat.format(strDouble);
}
return exrate;
}
/** 是否数字 */
public static boolean isNumber(Object object) {
Pattern pattern = Pattern.compile("\\d+(.\\d+)?$");
return pattern.matcher(object.toString()).matches();
}
}
分享到:
相关推荐
方便大家进行数值计算,进而帮助大家完成对数值分析的学习
教程中可能还包括丰富的实例和习题,帮助读者加深对理论的理解和实际操作的技能。在实际应用中,数值分析方法常被用于科学计算、工程仿真、经济预测、数据分析等领域,因此掌握这一领域的知识对于现代科技工作者来说...
入门"是一个逐步学习和实践的过程,需要结合理论知识与实际操作,通过Excel这个工具来理解和掌握游戏数值设计的精髓。只有深入理解每一种数值背后的含义和影响,才能创造出引人入胜的游戏世界。
题目中还包含了求解具体问题的过程,如使用迭代公式求解方程、设计高代数精度的求积公式以及应用矩阵直接三角分解法解线性方程组等实际操作。这些练习旨在检验考生对数值分析理论的理解和应用能力。
通过Python、MATLAB等工具,学生可以将理论知识转化为实际操作,进一步提高解决实际问题的能力。 总的来说,这份资源为学习数值分析的学生提供了丰富的学习资料,不仅有助于他们深入理解课程内容,还为他们在考试和...
6. **矩阵运算**:在数值计算中,矩阵操作是关键。可能包含矩阵乘法、特征值计算、奇异值分解等。 7. **优化问题**:最优化问题是数值计算中的重要应用,包括梯度下降法、牛顿法、拟牛顿法以及遗传算法等。 8. **...
1. **矩阵与数组操作**:MATLAB以矩阵为基础,书中的内容可能包括矩阵的创建、操作、索引和矩阵运算,如加减乘除、求逆、特征值和特征向量等。 2. **数值线性代数**:介绍求解线性方程组的算法,如高斯消元法、LU...
MATLAB中的`diff`函数是进行一维数值微分的常用工具,它可以对数据序列进行差分操作以近似导数值。例如,对于一个函数f在点x处的导数,可以通过`diff(f,x)`来估算。此外,`fnder`函数可以从用户定义的函数中构建差分...
通过《数值方法 习题答案》的学习,学生不仅可以深化对各个知识点的理解,还能通过解答习题提高实际操作能力,为解决实际工程和科研问题打下坚实基础。这份资料对于巩固理论知识、提升实践技能都具有极高的价值。
在面试中,理解 Number 类及其子类的特性,以及如何有效地使用它们进行数值操作,是非常重要的。这不仅涉及基本的类型转换,还包括错误处理、数值比较、数学运算以及格式化输出等多个方面。掌握这些知识将有助于在...
本次课程设计以实际操作和实验为主,通过Matlab这一强大的数值计算工具,学生可以深入理解数值方法的基本原理和应用技巧。 描述中提到的“绘制Koch分形曲线”是一项典型的实验任务,它涉及到分形几何的概念。Koch...
书中会介绍MATLAB的界面、基本操作以及数据类型等基础知识。 3. **插值法**:在数值分析中,插值法是通过构造一个多项式函数来近似给定数据点的值。MATLAB中的`interp1`和` interp2`函数可以实现一维和二维插值。 ...
10. **数组操作和控制流**:了解如何使用循环、条件语句以及数组操作(如索引、切片、广播等)对于编写高效的数值分析代码至关重要。 通过学习和实践这些Matlab数值分析的源代码,用户不仅可以加深对数值方法的理解...
在数值分析中,MATLAB因其便捷的矩阵操作和丰富的内置函数,成为了进行数值计算的理想工具。 李庆扬的《数值分析》第五版是数值计算领域的经典教材,涵盖了线性代数、微积分、微分方程、插值与拟合、数值积分与微分...
7. **OpenCV**:虽然主要为图像处理,但也包含一些数值分析的函数,如矩阵操作。 在这些Java程序中,可能会涉及到以下几个主题: - **线性代数**:包括矩阵的创建、加减乘除、求逆、特征值和特征向量、LU分解、QR...
学生在掌握了理论和实际操作后,可以针对不同领域(如航天航空、汽车、电子设备的热设计等)进行传热分析和优化。 由于教材和课件的背景是在西安交通大学,这所学府在国内热科学与流体力学领域具有重要地位。由陶...
矩阵的加减乘除、转置、求逆、特征值和特征向量等操作是数值计算中的常见任务,课后答案会详细展示如何使用MATLAB函数实现这些操作。 再者,函数的使用和编写也是重要的知识点。MATLAB允许用户自定义函数,通过.m...
本书旨在帮助读者理解数值分析的基本概念和算法,并掌握使用MATLAB进行数值计算的实际操作技巧。 首先,我们来看看“MATLAB快速入门多媒体辅助教学软件”。这部分内容可能是通过互动式的多媒体教程,引导读者熟悉...
### 数值分析实验:关于误差的影响 #### 一、引言 在计算机科学与数值分析领域,误差控制是一项至关重要的技术。本实验旨在探讨在数值分析中如何有效地控制和减少误差,特别是在涉及小数减法时。通过一个具体的示例...