Java中的简单浮点数类型float和double不能够进行运算。不光是Java,在其它很多编程语言中也有这样的问题。在大多数情况下,计算的结果是准确的,但是多试几次(可以做一个循环)就可以试出类似上面的错误。现在终于理解为什么要有BCD码了。
这个问题相当严重,如果你有9.999999999999元,你的计算机是不会认为你可以购买10元的商品的。
在有的编程语言中提供了专门的货币类型来处理这种情况,但是Java没有。现在让我们看看如何解决这个问题。
四舍五入
我们的第一个反应是做四舍五入。Math类中的round方法不能设置保留几位小数,我们只能象这样(保留两位):
public double round(double value){
return Math.round(value*100)/100.0;
}
非常不幸,上面的代码并不能正常工作,给这个方法传入4.015它将返回4.01而不是4.02,如我们在上面看到的
4.015*100=401.49999999999994
因此如果我们要做到精确的四舍五入,不能利用简单类型做任何运算
java.text.DecimalFormat也不能解决这个问题:
System.out.println(new java.text.DecimalFormat("0.00").format(4.025));
输出是4.02
java 代码
view plaincopy to clipboardprint?
/**
* <pre>
* 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精
* 确的浮点数运算,包括加减乘除和四舍五入。
* </pre>
*/
public class Arith
{
//默认除法运算精度
private static final int DEF_DIV_SCALE = 10;
//这个类不能实例化
private Arith()
{
}
/**
* <pre>
*
* 提供精确的加法运算。
*
* @param v1 被加数
* @param v2 加数
*
* @return 两个参数的和
* </pre>
*/
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();
}
/**
* <pre>
*
* 提供精确的减法运算。
*
* @param v1 被减数
*
* @param v2 减数
* @return 两个参数的差
* </pre>
*/
public static double sub(double v1, double v2)
{
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.subtract(b2).doubleValue();
}
/**
* <pre>
* 提供精确的乘法运算。
*
* @param v1 被乘数
* @param v2 乘数
*
* @return 两个参数的积
* </pre>
*/
public static double mul(double v1, double v2)
{
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.multiply(b2).doubleValue();
}
/**
* <pre>
*
* 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到
*
* 小数点以后10位,以后的数字四舍五入。
*
* @param v1 被除数
*
* @param v2 除数
*
* @return 两个参数的商
* </pre>
*/
public static double div(double v1, double v2)
{
return div(v1, v2, DEF_DIV_SCALE);
}
/**
* <pre>
*
* 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
*
* 定精度,以后的数字四舍五入。
*
* @param v1 被除数
*
* @param v2 除数
*
* @param scale 表示表示需要精确到小数点以后几位。
*
* @return 两个参数的商
* </pre>
*/
public static double div(double v1, double v2, int scale)
{
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, BigDecimal.ROUND_HALF_UP).doubleValue();
}
/**
* <pre>
*
* 提供精确的小数位四舍五入处理。
*
* @param v 需要四舍五入的数字
* @param scale 小数点后保留几位
* @return 四舍五入后的结果
* </pre>
*/
public static double round(double v, int scale) {
if (scale < 0)
{
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b = new BigDecimal(Double.toString(v));
BigDecimal one = new BigDecimal("1");
return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}
}
分享到:
相关推荐
本文将详细解析如何在Java中实现四舍五入,并探讨不同方法的适用场景。 ### Java四舍五入的基础概念 四舍五入是指将一个数字舍去小数部分时,如果小数部分小于等于0.4,则向下取整;如果小数部分大于等于0.6,则...
不过,根据提供的描述,这个问题相对简单,主要关注的是基本的四舍五入和整数部分的提取。 至于文档"四舍五入.docx",它可能包含更详细的代码示例、解释或者练习题,可以帮助读者深入理解这个主题。打开并阅读这个...
在Java编程语言中,处理数字的四舍五入操作是一项常见的任务,特别是在计算、财务或者数据分析等场景。本文将深入探讨Java中如何进行四舍五入,并基于提供的`Arith.java`文件,来分析其可能包含的实现方式。 首先,...
总结一下,Java中的浮点数精确计算主要是通过`java.math.BigDecimal`类来实现的,而"Java实现的浮点类的精确计算"则可能是一个自定义工具类,封装了`BigDecimal`的操作,以提供方便、准确的浮点数计算服务。...
在Java中,可以使用`BigDecimal`类来实现四舍五入并保留两位小数的功能。`BigDecimal`类提供了非常强大的高精度算术运算能力,非常适合处理财务计算等场景。 **示例代码**: ```java import java.math.BigDecimal;...
标题中的"Java 精确计算 - double-float-String"指向的是Java中处理浮点数(double和float)以及字符串表示的数值时可能遇到的精度问题,以及如何通过特定方法实现精确计算。描述中提到的链接指向了一个具体的博客...
我们可以使用以下代码来实现四舍五入: ```java public double round(double value) { return Math.round(value * 100) / 100.0; } ``` 然而,这个方法并不能正常工作。例如,给这个方法传入 4.015,它将返回 ...
2. **四舍五入方法**:对于某些应用来说,简单的四舍五入可能就足够了。例如,可以使用 `BigDecimal` 的 `setScale` 方法来指定需要保留的小数位数。 ```java public static double round(double value, int ...
标题 "sishewuru.rar_四舍五入" 暗示了我们关注的主题是关于数值计算中的四舍五入操作。在这个主题下,我们将深入探讨四舍五入的定义、用途、方法以及在编程中实现四舍五入的常见算法。 四舍五入是一种在数学和...
在Java编程语言中,有时我们需要对浮点数进行四舍五入操作,以便在特定场景下得到精确的小数值。以下是一些常用的Java四舍五入保留小数的实现方法: ### 方法一:使用`BigDecimal` `BigDecimal`是Java中处理高精度...
- **转换为`double`或`float`**:如果需要将`BigDecimal`对象转换回`double`或`float`类型,可以通过调用相应的转换方法实现,但在转换之前最好先进行适当的四舍五入处理。 通过上述方法,可以在Java中实现浮点数...
常用的舍入模式包括CEILING(向正无穷方向舍入)、FLOOR(向负无穷方向舍入)、HALF_UP(四舍五入)等。选择合适的舍入模式对于获得正确的计算结果至关重要。 此外,对BigDecimal对象进行操作,相较于基本的数值...
标题"test2_JavaDouble类型比较大小_java编程_"提示我们关注的是Java中`Double`类型的比较操作。通常,我们可能会像处理整数那样直接使用`>`或`来比较两个`Double`值,例如`double a = 0.1; double b = 0.2; if (a +...
在Java编程语言中,对数字进行四舍五入并保留指定的小数位数是常见的需求。以下是五种不同的方法来实现这一目标: 1. **使用`BigDecimal`类**: `BigDecimal`是Java中用于处理高精度、大数值计算的类,提供了多种...
java数学计算工具类 double精确的加法算法 double精确的减法算法 精确的乘法算法 对精确的除法运算,当发生除不尽的 保留小数、数值精度
* (由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精确的浮点数运算,包括加减乘除和四舍五入) * @author chenke * @time 2017/12/5 16:22 * @mail ch_chenke@163.com */ public class Arith...
该工具用户进行double类型的精度计算,包含加法、减法、乘法、除法、精确点计算、小数点计算,限制小数点后数字
我们首先将 double 类型的数据转换为 BigDecimal 对象,然后使用 setScale 方法来设置精度位数和 roundingMode。最后,我们将 BigDecimal 对象转换回 double 类型的数据。 此外,我们还可以使用 BigDecimal 类来...
在Java编程语言中,四舍五入是一种常见的数学操作,特别是在处理浮点数时,我们可能需要将结果精确到特定的小数位数。本示例将深入讲解如何使用Java实现四舍五入并保留两位小数。这在财务计算、统计分析和其他需要...
标签“精确计算”进一步确认了这个类包的功能,它专注于提供无舍入误差的计算方法,以确保结果的准确性。这通常包括加法、减法、乘法、除法以及更复杂的数学运算。 压缩包子文件"Arith"可能包含了这个精确计算类库...