double的计算不精确,会有类似0.0000000000000002的误差,正确的方法是使用BigDecimal或者用整型
整型地方法适合于货币精度已知的情况,比如12.11+1.10转成1211+110计算,最后再/100即可
以下是摘抄的BigDecimal方法:
/**
* double的计算不精确,会有类似0.0000000000000002的误差,正确的方法是使用BigDecimal或者用整型
整型地方法适合于货币精度已知的情况,比如12.11+1.10转成1211+110计算,最后再/100即可
以下是摘抄的BigDecimal方法:
*/
import java.io.Serializable;
import java.math.BigDecimal;
import org.springframework.stereotype.Component;
@Component
public class DoubleUtil implements Serializable {
private static final long serialVersionUID = -3345205828566485102L;
// 默认除法运算精度
private static final Integer DEF_DIV_SCALE = 2;
/**
* 提供精确的加法运算。
* @param value1 被加数
* @param value2 加数
* @return 两个参数的和
*/
public Double add(Number value1, Number value2) {
BigDecimal b1 = new BigDecimal(Double.toString(value1.doubleValue()));
BigDecimal b2 = new BigDecimal(Double.toString(value2.doubleValue()));
return b1.add(b2).doubleValue();
}
/**
* 提供精确的减法运算。
*
* @param value1
* 被减数
* @param value2
* 减数
* @return 两个参数的差
*/
public double sub(Number value1, Number value2) {
BigDecimal b1 = new BigDecimal(Double.toString(value1.doubleValue()));
BigDecimal b2 = new BigDecimal(Double.toString(value2.doubleValue()));
return b1.subtract(b2).doubleValue();
}
/**
* 提供精确的乘法运算。
*
* @param value1
* 被乘数
* @param value2
* 乘数
* @return 两个参数的积
*/
public Double mul(Number value1, Number value2) {
BigDecimal b1 = new BigDecimal(Double.toString(value1.doubleValue()));
BigDecimal b2 = new BigDecimal(Double.toString(value2.doubleValue()));
return b1.multiply(b2).doubleValue();
}
/**
* 提供(相对)精确的除法运算,当发生除不尽的情况时, 精确到小数点以后10位,以后的数字四舍五入。
*
* @param dividend
* 被除数
* @param divisor
* 除数
* @return 两个参数的商
*/
public Double div(Double dividend, Double divisor) {
return div(dividend, divisor, DEF_DIV_SCALE);
}
/**
* 提供(相对)精确的除法运算。 当发生除不尽的情况时,由scale参数指定精度,以后的数字四舍五入。
*
* @param dividend
* 被除数
* @param divisor
* 除数
* @param scale
* 表示表示需要精确到小数点以后几位。
* @return 两个参数的商
*/
public Double div(Double dividend, Double divisor, Integer scale) {
if (scale < 0) {
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b1 = new BigDecimal(Double.toString(dividend));
BigDecimal b2 = new BigDecimal(Double.toString(divisor));
return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}
/**
* 提供精确的小数位四舍五入处理。
*
* @param value
* 需要四舍五入的数字
* @param scale
* 小数点后保留几位
* @return 四舍五入后的结果
*/
public Double round(Double value, Integer scale) {
if (scale < 0) {
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b = new BigDecimal(Double.toString(value));
BigDecimal one = new BigDecimal("1");
return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}
}
分享到:
相关推荐
首先,我们要理解Java的基础数据类型,包括整型(byte, short, int, long)、浮点型(float, double)以及它们在数值计算中的应用。Java的数据类型提供了精确的数值存储和运算,但需要注意浮点型数据在进行计算时...
在数值计算中,理解和掌握这些数据类型的范围、精度以及它们之间的转换至关重要。运算符如加减乘除、取余、位操作等也是基础,它们用于构建复杂的数学表达式。 2. **复数运算**:除了基本的实数运算,Java还支持...
在《Effective Java》这本书中也提到这个原则,float 和 double 只能用来做科学计算或者是工程计算,在商业计算中我们要用 java.math.BigDecimal。BigDecimal 一共有 4 个够造方法,我们可以使用 BigDecimal(double ...
在Java编程语言中,`double` 类型是一种用于表示64位浮点数的原始数据类型。虽然 `double` 提供了相对较高的精度,但在涉及精确数学运算(特别是涉及到小数值)时,由于其内部采用二进制浮点数格式存储,仍会出现...
标题"test2_JavaDouble类型比较大小_java编程_"提示我们关注的是Java中`Double`类型的比较操作。通常,我们可能会像处理整数那样直接使用`>`或`来比较两个`Double`值,例如`double a = 0.1; double b = 0.2; if (a +...
1. **线性代数运算**:Java中的`Apache Commons Math`库提供了矩阵和向量的操作,包括求解线性方程组、矩阵乘法、特征值和特征向量计算等。例如,使用`LUDecomposition`类可以对矩阵进行LU分解,进而求解线性方程组...
数值计算中,算法的稳定性关乎结果的可靠性。理解舍入误差、浮点数表示误差以及如何选择合适的算法以降低误差是数值计算的关键。 总的来说,这个"Java 常用数值算法集"包含了从基础计算到复杂优化的丰富内容,是...
标题中的"Java 精确计算 - double-float-String"指向的是Java中处理浮点数(double和float)以及字符串表示的数值时可能遇到的精度问题,以及如何通过特定方法实现精确计算。描述中提到的链接指向了一个具体的博客...
在Java中,浮点数(float和double)是基于IEEE 754标准的,它们使用二进制浮点表示法,这导致在进行除法、乘法、加法和减法等操作时可能会出现非预期的精度损失。例如,两个看似相等的浮点数在计算后可能因为舍入...
在Java编程语言中,公式计算是一项常见的需求,特别是在科学计算、数据分析、数学建模等领域。为了简化这方面的代码编写,开发者经常会将各种计算操作封装成方法,以便在项目中直接调用。标题“java 公式计算汇总,...
在Java编程语言中,求对数是常见的数学...总的来说,Java提供了丰富的数学工具来计算对数,使得开发者可以轻松地在代码中实现对数运算。理解并熟练运用这些方法,将有助于解决各种涉及指数运算的问题,提升编程效率。
这些函数在数值计算中极为常见。 3. **线性代数**:在解决多变量问题时,矩阵和向量操作是必不可少的。虽然Java标准库没有提供完整的线性代数支持,但有第三方库如Apache Commons Math或JAMA可以辅助实现。 4. **...
标准分是指一组数据中每个数值与平均值的偏差程度,通常用于衡量数据的相对位置。此方法可以应用于多种场景,例如教育领域的成绩分析、数据分析等。 ### 二、代码解析 #### 2.1 类结构 - **包名**:`comm` - **...
java程序中数值的精度问题,float、double容易产生精度数值问题,不适合精度计算,而bigdecimal正好解决这一问题
它展示了一个完整的计算流程,从获取用户输入到执行运算再到显示结果,是Java初学者的一个良好起点。通过深入这个项目,开发者可以进一步理解和掌握面向对象编程的概念,如类、对象、方法以及输入/输出处理。
Java语言作为广泛使用的编程语言之一,虽然提供了浮点数类型如float和double,用于执行数值计算,但这些类型在处理时往往伴随着舍入误差,这是因为在二进制表示下,一些十进制小数无法得到精确表示。为了解决这一...
在JAVA编程中,处理数值运算是一项常见的任务,尤其是在涉及到大数值的时候。本篇文章将深入探讨如何在不涉及精度处理和不使用强制类型转换的情况下,进行取整、取小数、保留特定位数的小数以及计算自幂数的操作。...
下面我们将详细探讨Java中的数值范围、float和double类型的精度问题,并且提供解决方案。 一、Java中的数值范围 Java中的基本数据类型有多种,包括整数类型(int、long)、浮点数类型(float、double)。每种类型...
`double`数组通常用于存储浮点数值,例如在科学计算、统计分析或任何需要精确小数点后数字的场景中。下面,我们将深入探讨Java对`double`数组排序的实现方法以及代码中的关键细节。 首先,让我们看一下提供的代码...