package com.anyi.business.bank.tpp.pub;
import java.math.BigDecimal;
import com.martian.utils.tools.LogTools;//公司的框架,封装log4j,记录日志
/**
* 数字的处理
*/
public class MathTools {
/** 两位精度 */
private final static int PRECISION_TWO = 2;
private static final char[] RMB_NUMS = "零壹贰叁肆伍陆柒捌玖".toCharArray();
private static final String[] UNITS = { "元", "角", "分", "整" };
private static final String[] U1 = { "", "拾", "佰", "仟" };
private static final String[] U2 = { "", "万", "亿" };
/**
* 求和:四舍五入,小数点后保留两位有效数字
*
* @param augend
* 被加数
* @param addend
* 加数
* @return 和
*/
public static double add(double augend, double addend) {
BigDecimal sum = BigDecimal.valueOf(augend).add(
BigDecimal.valueOf(addend));
return setScale(sum).doubleValue();
}
/**
* 求差:四舍五入,小数点后保留两位有效数字
*
* @param minuend
* 被减数
* @param subtrahend
* 减数
* @return 差
*/
public static double subtract(double minuend, double subtrahend) {
BigDecimal difference = BigDecimal.valueOf(minuend).subtract(
BigDecimal.valueOf(subtrahend));
return setScale(difference).doubleValue();
}
/**
* 求积:四舍五入,小数点后保留两位有效数字
*
* @param multiplicand
* 被乘数
* @param multiplier
* 乘数
* @return 积
*/
public static double multiply(double multiplicand, double multiplier) {
BigDecimal product = BigDecimal.valueOf(multiplicand).multiply(
BigDecimal.valueOf(multiplier));
return setScale(product).doubleValue();
}
/**
* 求商:四舍五入,小数点后保留两位有效数字
*
* @param dividend
* 被除数
* @param divisor
* 除数
* @return 商
*/
public static double divide(double dividend, double divisor) {
int scale = PRECISION_TWO;
int roundingMode = BigDecimal.ROUND_HALF_UP;
BigDecimal quotient = BigDecimal.valueOf(dividend).divide(
BigDecimal.valueOf(divisor), scale, roundingMode);
return quotient.doubleValue();
}
/**
* 求和:四舍五入,根据参数scale确定小数点后保留有效数字位数
*
* @param augend
* 被加数
* @param addend
* 加数
* @param scale
* 刻度、数值范围
* @return 和
*/
public static double add(double augend, double addend, int scale) {
BigDecimal sum = BigDecimal.valueOf(augend).add(
BigDecimal.valueOf(addend));
return setScale(sum, scale).doubleValue();
}
/**
* 求差:四舍五入,根据参数scale确定小数点后保留有效数字位数
*
* @param minuend
* 被减数
* @param subtrahend
* 减数
* @param scale
* 刻度、数值范围
* @return 差
*/
public static double subtract(double minuend, double subtrahend, int scale) {
BigDecimal difference = BigDecimal.valueOf(minuend).subtract(
BigDecimal.valueOf(subtrahend));
return setScale(difference, scale).doubleValue();
}
/**
* 求积:四舍五入,根据参数scale确定小数点后保留有效数字位数
*
* @param multiplicand
* 被乘数
* @param multiplier
* 乘数
* @param scale
* 刻度、数值范围
* @return 积
*/
public static double multiply(double multiplicand, double multiplier,
int scale) {
BigDecimal product = BigDecimal.valueOf(multiplicand).multiply(
BigDecimal.valueOf(multiplier));
return setScale(product, scale).doubleValue();
}
/**
* 求商:四舍五入,根据参数scale确定小数点后保留有效数字位数
*
* @param dividend
* 被除数
* @param divisor
* 除数
* @param scale
* 刻度、数值范围
* @return 商
*/
public static double divide(double dividend, double divisor, int scale) {
int roundingMode = BigDecimal.ROUND_HALF_UP;
BigDecimal quotient = BigDecimal.valueOf(dividend).divide(
BigDecimal.valueOf(divisor), scale, roundingMode);
return quotient.doubleValue();
}
/**
* 求和,没有限制
*
* @param addend
* 加数
* @param augend
* 被加数
* @return 和
*/
public static double addWithoutRestriction(double addend, double augend) {
BigDecimal sum = BigDecimal.valueOf(addend).add(
BigDecimal.valueOf(augend));
return sum.doubleValue();
}
/**
* 求差,没有限制
*
* @param minuend
* 被减数
* @param subtrahend
* 减数
* @return 差
*/
public static double subtractWithoutRestriction(double minuend,
double subtrahend) {
BigDecimal difference = BigDecimal.valueOf(minuend).subtract(
BigDecimal.valueOf(subtrahend));
return difference.doubleValue();
}
/**
* 求积,没有限制
*
* @param multiplicand
* 被乘数
* @param multiplier
* 乘数
* @return 积
*/
public static double multiplyWithoutRestriction(double multiplicand,
double multiplier) {
BigDecimal product = BigDecimal.valueOf(multiplicand).multiply(
BigDecimal.valueOf(multiplier));
return product.doubleValue();
}
/**
* 求商,没有限制
*
* @param dividend
* 被除数
* @param divisor
* 除数
* @return 商
* @throws ArithmeticException
* 当准确的商值没有无穷的十进制扩展 或者 divisor==0
*/
public static double divideWithoutRestriction(double dividend,
double divisor) throws ArithmeticException {
BigDecimal quotient = BigDecimal.valueOf(dividend).divide(
BigDecimal.valueOf(divisor));
return quotient.doubleValue();
}
/**
* 求相反数
*
* @param val
* 数值
* @return 相反数
*/
public static double negate(double val) {
BigDecimal negate = BigDecimal.valueOf(val).negate();
return setScale(negate).doubleValue();
}
/**
* 求相反数,根据参数scale确定小数点后保留有效数字位数
*
* @param val
* 数值
* @param scale
* 刻度、数值范围
* @return
*/
public static double negate(double val, int scale) {
BigDecimal negate = BigDecimal.valueOf(val).negate();
return setScale(negate, scale).doubleValue();
}
/**
* 四舍五入,小数点后保留两位有效数字
*
* @param val
* 数字
* @return 四舍五入,小数点后保留两位有效数字后的数字
*/
public static BigDecimal setScale(BigDecimal val) {
return val.setScale(PRECISION_TWO, BigDecimal.ROUND_HALF_UP);
}
/**
* 四舍五入,根据参数scale确定小数点后保留有效数字位数
*
* @param val
* 数字
* @param scale
* 小数点后保留有效数字的位数
* @return
*/
public static BigDecimal setScale(BigDecimal val, int scale) {
return val.setScale(scale, BigDecimal.ROUND_HALF_UP);
}
/**
* 将金额(整数部分等于或少于12位,小数部分2位)转换为中文大写形式.
*
* @param amount
* 金额数字
* @return 中文大写
* @throws IllegalArgumentException
*/
public static String convert(String amount) throws IllegalArgumentException {
String result = "";
String integer = ""; // 整数部分
String fraction = ""; // 小数部分
boolean isNegative = false;
// 去掉分隔符
amount = amount.replace(",", "");
// 去掉负号
if (!(amount.indexOf("-") == -1)) {
amount = amount.replace("-", "");
isNegative = true;
}
// 验证金额正确性
if (!checkNum(amount))
throw new NumberFormatException("非法数据,请检查!");
if (Double.valueOf(amount) == 0) {
return result = "零元整";
}
if (amount.indexOf(".") == -1) {
integer = amount;
fraction = "00";
} else {
int index = amount.indexOf(".");
integer = amount.substring(0, index);
fraction = amount.substring(index + 1);
}
if (!integer.equals("0")) {
result += integer2rmb(integer) + UNITS[0]; // 整数部分
}
if (fraction.equals("00")) {
result += UNITS[3]; // 添加[整]
} else if (fraction.startsWith("0") && integer.equals("0")) {
result += fraction2rmb(fraction).substring(1); // 去掉分前面的[零]
} else {
result += fraction2rmb(fraction); // 小数部分
}
if (isNegative) {
return "负".concat(result);
}
return result;
}
// 将金额小数部分转换为中文大写
private static String fraction2rmb(String fraction) {
char jiao = fraction.charAt(0); // 角
char fen = fraction.charAt(1); // 分
return (RMB_NUMS[jiao - '0'] + (jiao > '0' ? UNITS[1] : ""))
+ (fen > '0' ? RMB_NUMS[fen - '0'] + UNITS[2] : "");
}
// 将金额整数部分转换为中文大写
private static String integer2rmb(String integer) {
StringBuilder buffer = new StringBuilder();
// 从个位数开始转换
int i, j;
for (i = integer.length() - 1, j = 0; i >= 0; i--, j++) {
char n = integer.charAt(i);
if (n == '0') {
// 当n是0且n的右边一位不是0时,插入[零]
if (i < integer.length() - 1 && integer.charAt(i + 1) != '0') {
buffer.append(RMB_NUMS[0]);
}
// 插入[万]或者[亿]
if (j % 4 == 0) {
if (i > 0 && integer.charAt(i - 1) != '0' || i > 1
&& integer.charAt(i - 2) != '0' || i > 2
&& integer.charAt(i - 3) != '0') {
buffer.append(U2[j / 4]);
}
}
} else {
if (j % 4 == 0) {
buffer.append(U2[j / 4]); // 插入[万]或者[亿]
}
buffer.append(U1[j % 4]); // 插入[拾]、[佰]或[仟]
buffer.append(RMB_NUMS[n - '0']); // 插入数字
}
}
return buffer.reverse().toString();
}
/**
* 判断用户输入的数据是否合法,用户只能输入大于零的数字,不能输入其它字符
*
* @param s
* String
* @return 如果用户输入数据合法,返回 true,否则返回 false
*/
private static boolean checkNum(String s) {
// 如果用户输入的数里有非数字字符,则视为非法数据,返回 false
try {
if (s.indexOf(".") == -1) {
if (s.length() >= 13) {
LogTools.debug("整数位大于11位");
return false;
}
} else {
int fractionDigits = s.length() - s.indexOf(".") - 1;
if (s.indexOf(".") >= 13) {
LogTools.debug("整数位大于11位");
return false;
} else if (fractionDigits > 2) {
LogTools.debug("小数位多于两位。");
return false;
}
}
Double.valueOf(s);
return true;
} catch (NumberFormatException e) {
LogTools.debug("非法数据,请检查!");
return false;
}
}
}
分享到:
相关推荐
1. **熟悉常见离散时间信号的产生方法**:离散时间信号是数字信号处理的基础,包括单位脉冲序列、正弦波、矩形波等。在MATLAB中,可以使用`ones`,`sin`,`rectpuls`等函数来创建这些基本信号。 2. **熟悉离散时间...
数字信号处理实习的讲义第三部分主要探讨了滤波这一关键概念,特别是FIR(有限长单位脉冲响应)和IIR(无限长单位脉冲响应)滤波器的区别以及FIR滤波器的设计方法。滤波在数字信号处理中扮演着至关重要的角色,广泛...
【通信实习报告 单位实习报告】 实习报告是学习与实践相结合的重要环节,特别是对于通信工程专业的学生来说,深入理解并应用所学理论知识至实际工作中至关重要。以下将围绕通信工程实习中的关键知识点进行详细阐述...
在"数字信号处理实习实验二离散信号的频谱分析MATLAB"中,我们将探讨如何利用MATLAB进行离散信号的频谱分析。 首先,离散信号是时间上离散的信号,通常由采样过程得到,它的值只在特定的时间点上被定义。在MATLAB中...
根据提供的信息,我们可以总结出以下关于“数字图像处理”的详细知识点: ### 数字图像处理概览 #### 课程基本信息 - **课程名称**:“数字图像处理” - **主讲人**:郑宏 - **所在单位**:武汉大学电子信息学院 ...
### 数字信号处理实践方法(第二版)例子程序(Matlab版) #### 知识点概述 本篇文章将根据《数字信号处理实践方法(第二版)》中的Matlab示例程序来解析数字信号处理中的几个核心概念和技术实现。本书由E.C. Ifeachor和...
在实习单位和岗位方面,学生可能会面临大学所学与实际工作的脱节,但通过适应和调整,可以逐渐融入工作环境。例如,可能需要参加专业岗位的岗前培训,以了解并适应计算科学与技术以及数字媒体技术的专业要求。在这个...
这里的"软件实习代码"涵盖了四个主要项目:学生管理系统、扑克牌操作、算术表达式处理以及坐标点的距离计算。每个项目都对应一个核心的编程知识点,下面将分别进行详细介绍。 首先,学生管理系统是一个常见的软件...
1. 实习单位简介:介绍实习所在的通信公司或机构的基本情况,如主营业务、技术水平、组织结构等。 2. 实习岗位职责:详细描述实习生在实习期间所承担的任务,例如参与通信网络的建设和维护、信号处理、通信设备调试...
在本“数字逻辑课程设计+实习报告”中,我们将探讨两个关键的数字逻辑系统:数字时钟和四位加法器。这两个项目是电子工程和计算机科学领域的基础,它们涉及到数字电路设计、逻辑门操作以及数字信号处理等核心概念。 ...
实习单位的领导和同事们的关心与指导,也让实习生感受到了职场文化的魅力,学会了如何在团队中发挥作用,提升了沟通和适应能力。 总结来说,事业单位会计实习是一次宝贵的经历,它让实习生从理论走向实践,从课堂...
1. 数字化测图软件CASS的内业成图训练:学生以小组为单位,整理野外测量的数据和草图,使用CASS软件进行内业编辑,确保符合图式要求。通过这个过程,学生能更好地理解和运用软件,提升综合制图能力。 2. 简编码数字...
【工厂会计实习单位实训说明】 实习是理论与实践相结合的重要环节,通过在巩义市亚欣炉料厂的会计实习,我深入理解了会计在实际工作中的应用,体验了会计人员的责任与挑战。该厂拥有先进的生产设备和检测手段,与多...
- **信号处理**:包括数字信号处理、模拟信号处理等,主要目的是对信号进行分析、转换或增强。 - **网络技术**:如计算机网络、移动通信网络等,重点在于网络架构设计、网络优化等方面。 - **无线通信**:涉及无线...
实际的实习报告内容应该会更加详尽和系统,包含实习单位介绍、实习内容、学习成果以及对于实习经历的个人反思和总结。在撰写正式报告时,学生们需要确保信息的准确性,并且把实习中遇到的实际问题和解决办法详细记录...
报告中详细描述了实习的时间、实习单位的背景以及在实习期间的具体工作内容,包括对会计流程的进一步理解和工作中遇到的问题。 正文: 实习是每个大学生从校园走向社会的重要桥梁,它让我们从理论学习迈向实际操作...
- **实习单位简介**:介绍实习单位的基本情况,包括但不限于单位名称、主营业务、规模等。 - **实习内容**:详细记录实习期间参与的主要工作项目、具体任务及完成情况。 - **实习心得**:总结实习过程中的体会与...
实习反馈管理则让学生可以对实习单位、指导老师等进行评价,为改进实习质量提供参考。 对于教师用户,他们主要负责学生实习评价管理。教师可以通过系统查看学生的实习日志,根据学生的工作表现给出评价,评估学生的...
5. Adobe Photoshop CS6是图像处理的行业标准,用于编辑和创作数字图像,是创意设计的重要组成部分。 6. PowerDesigner则是一款强大的数据库建模工具,允许用户在概念数据模型和物理数据模型之间进行设计,对于...