package numTest;
import java.math.BigDecimal;
/**
* 高精度计算辅助类,提供保留指定小数位的简单计算和四舍五入
*/
public class Num {
private static final BigDecimal one = new BigDecimal(1);
private BigDecimal decimal;
private int scale;
private int roundingMode = BigDecimal.ROUND_HALF_UP;
public Num() {
decimal = new BigDecimal(0);
}
public Num(double val) {
this.decimal = new BigDecimal(val);
}
/* public Num(double val, int scale) {
this.scale = scale;
this.decimal = new BigDecimal(val).setScale(scale, roundingMode);
}*/
public Num(double val, int scale, int roundingMode) {
this.scale = scale;
this.roundingMode = roundingMode;
this.decimal = new BigDecimal(val).setScale(scale, roundingMode);
}
public Num(Num num, int scale, int roundingMode) {
decimal = num.decimal.setScale(scale, roundingMode);
}
public BigDecimal getDecimal() {
return decimal;
}
public Num setDecimal(BigDecimal decimal) {
this.decimal = decimal;
return this;
}
public int getScale() {
return scale;
}
public void setScale(int scale) {
this.scale = scale;
this.decimal = this.decimal.setScale(scale);
}
public double doubleValue() {
return decimal.doubleValue();
}
public Num divide(Num num) {
return divide(setOtherNum(num), scale, roundingMode);
}
public Num divide(double val) {
Num num = new Num(val);
return divide(num);
}
public Num divide(Num num, int scale) {
return divide(num, scale, roundingMode);
}
public Num divide(Num num, int scale, int roundingMode) {
return setDecimal(this.getDecimal().divide(num.getDecimal(), scale, roundingMode));
}
public Num multiply(Num num) {
return multiply(setOtherNum(num), scale, roundingMode);
}
public Num multiply(double val) {
Num num = new Num(val);
return multiply(num);
}
public Num multiply(Num num, int scale) {
return multiply(num, scale, roundingMode);
}
public Num multiply(Num num, int scale, int roundingMode) {
return setDecimal(rounding(this.getDecimal().multiply(num.getDecimal()), scale, roundingMode));
}
public Num add(Num num) {
return add(setOtherNum(num), scale, roundingMode);
}
public Num add(double val) {
Num num = new Num(val);
return add(num);
}
public Num add(Num num, int scale) {
return add(num, scale, roundingMode);
}
public Num add(Num num, int scale, int roundingMode) {
return setDecimal(rounding(this.getDecimal().add(num.getDecimal()), scale, roundingMode));
}
public Num sub(Num num) {
return sub(setOtherNum(num), scale);
}
public Num sub(double val) {
Num num = new Num(val);
return sub(num);
}
public Num sub(Num num, int scale) {
return sub(num, scale, roundingMode);
}
public Num sub(Num num, int scale, int roundingMode) {
BigDecimal result = this.getDecimal().subtract(num.getDecimal());
result = rounding(result, scale, roundingMode);
return setDecimal(result);
}
private Num setOtherNum(Num num) {
num = new Num(num, scale, roundingMode);
return num;
}
public double round(int scale) {
return rounding(this.decimal, scale, roundingMode).doubleValue();
}
public double round(int scale, int roundingMode) {
return rounding(this.decimal, scale, roundingMode).doubleValue();
}
public static BigDecimal rounding(BigDecimal decimal, int scale, int roundingMode) {
return decimal.divide(one, scale, roundingMode);
}
public static BigDecimal rounding(BigDecimal decimal, int scale) {
return rounding(decimal, scale, BigDecimal.ROUND_HALF_UP);
}
public static double rounding(double val, int scale) {
return rounding(val, scale, BigDecimal.ROUND_HALF_UP);
}
public static double rounding(double val, int scale, int roundingMode) {
return rounding(new BigDecimal(val), scale, roundingMode).doubleValue();
}
@Override
public String toString() {
return "Num [decimal=" + decimal + ", scale=" + scale + ", roundingMode=" + roundingMode + "]";
}
}
分享到:
相关推荐
A Computer Based Approach,3e的基础上改编而成,内容涵盖了信号与信号处理、时域中的离散时间信号和系统、变换域中的离散时间信号、变换域中的LTI离散时间系统、连续时间信号的数字处理、数字滤波器的结构与设计等...
总的来说,"标准CDib类 数字图像处理"是一个强大的工具,它简化了Windows平台上的图像处理工作,同时也提供了高级功能,如高质量的位图缩放。对于需要进行图形编程的开发者来说,掌握和运用CDib类可以极大地提高开发...
"遥感数字图像处理" 遥感数字图像处理是指对遥感数字图像的处理、分析和应用。遥感数字图像是通过遥感技术获取的、以数字形式存储和表达的物理内容,它扩展了人类的视觉能力,包括空间、光谱、灰度等方面的扩展。 ...
在IT领域,数字图像处理是一种广泛应用的技术,尤其在生物医学、科研和工程中。本项目“数字图像处理:细胞数量形状分类”旨在实现对细胞图像的自动化分析,包括细胞的分割、计数以及根据形状特征进行分类。这个任务...
CDIB类是Visual C++编程中一个专门用于处理数字图像的类,它基于Windows平台的设备无关位图(Device Independent Bitmap, DIB)结构。《Visual C++实践与提高——数字图像处理与工程应用篇》这本书深入探讨了如何...
《Visual C++数字图像处理技术详解》以数字图像处理技术为主线,全面地介绍在Visual C++环境下进行数字图像处理程序设计的方法。内容涵盖了数字图像的变换、增强、复原、重建、形态学处理、分割、匹配、压缩编码、...
7. 机器学习与深度学习:近年来,基于深度神经网络的图像处理方法取得了显著成果,如卷积神经网络(CNN)、循环神经网络(RNN)和生成对抗网络(GAN)在图像分类、识别、检测等方面发挥重要作用。 通过《数字图像...
"遥感数字图像处理课后习题详解.pdf" 本文将对遥感数字图像处理的相关知识点进行详细的解释和总结。 一、图像的定义和分类 图像是一种对客观对象的相似性描述或写真,包含了该客观对象的信息。根据图像的明暗程度...
数字信号处理是现代通信、音频与视频处理、医学成像以及其他众多领域中不可或缺...通过该教材的学习,读者可以掌握数字信号处理的基本概念、分析方法和设计流程,为未来在相关领域的深入研究和专业工作奠定坚实的基础。
本篇将围绕"**C++编写的数字图像处理类**"这一主题,探讨如何在VC6.0环境下利用C++编写一个类来实现基本的图像处理功能,特别是针对24位(RGB)位图文件的操作。 首先,24位图是指每个像素由红、绿、蓝三个颜色通道...
这个名为"数字处理工具.docx"的文件提供了一组Java实用类`NumberUtil`,用于实现数字与百分比之间的转换,以及数字到会计计数格式的转换。下面将详细解释这些功能的实现原理和应用场景。 1. **数字转会计计数**: `...
- **图像处理**:虽然主要是针对数字信号,但很多图像处理技术,如边缘检测、频域分析,也可借用数字信号处理的概念和方法。 在C#中进行数字信号处理,开发者需要理解信号处理的基本理论,并结合C#的语法和类库来...
传统的语音增强技术主要依赖于模拟电路,但随着数字信号处理技术的不断进步,基于数字信号处理方法的语音增强技术已成为主流。本文将详细探讨这一技术的应用和实现方法。 语音信号是人类沟通的主要载体,但由于环境...
在本课程“数字图像处理”中,我们涵盖了广泛的知识领域,包括图像的获取、表示、分析和处理。这个实验报告和期末大作业是南京工程学院数据科学与大数据技术专业学生学习过程中的重要组成部分,旨在深入理解和应用所...
《数字图像处理的基本原理和常用方法》 数字图像处理是一门综合了计算机科学、信号处理、视觉感知等领域的交叉学科,其核心在于将图像信号转化为数字形式,以便于计算机进行高效处理。这一过程始于20世纪50年代,...
现代数字信号处理方法与技术是信息技术领域中的一个重要分支,它主要涉及如何在数字域内对信号进行采集、分析、变换和处理。随着计算机技术的发展,数字信号处理已经广泛应用于通信、图像处理、音频处理、生物医学...
《数字图像处理基础》是朱虹教授主讲的一门课程,主要探讨了图像处理领域的基本概念、理论和技术。从给出的描述来看,课程内容可能从第三章开始,这意味着前两章的内容可能涵盖了一些预备知识,如图像的基本概念、...
- **模拟图像**:指那些空间坐标和明暗程度都是连续变化的图像,这类图像不能被计算机直接处理。 - **数字图像**:指图像的空间坐标和灰度均不连续,而是通过离散数值(通常是整数)来表示的图像。它是计算机可以...
这些分类对于选择合适的处理方法至关重要。 2. **图像处理方式**:主要包括模拟图像处理和数字图像处理。数字图像处理利用计算机进行操作,包括图像到图像的变换、分析和理解,广泛应用于图像质量改善、压缩和目标...