`
周禄康
  • 浏览: 161609 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

java实现double的精确计算和四舍五入

阅读更多

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();

 }

}

分享到:
评论
1 楼 403577706 2013-07-11  
你好,我想咨询你一下,一个string 型的1.2000, 我想转为1.20 double型的。 可是结果是1.2 没有精确到小数点两位。麻烦你给指点一下。谢谢了。

相关推荐

    java 四舍五入 需要的朋友看看

    本文将详细解析如何在Java中实现四舍五入,并探讨不同方法的适用场景。 ### Java四舍五入的基础概念 四舍五入是指将一个数字舍去小数部分时,如果小数部分小于等于0.4,则向下取整;如果小数部分大于等于0.6,则...

    四舍五入_四舍五入问题_源码

    不过,根据提供的描述,这个问题相对简单,主要关注的是基本的四舍五入和整数部分的提取。 至于文档"四舍五入.docx",它可能包含更详细的代码示例、解释或者练习题,可以帮助读者深入理解这个主题。打开并阅读这个...

    关于java的四舍五入问题

    在Java编程语言中,处理数字的四舍五入操作是一项常见的任务,特别是在计算、财务或者数据分析等场景。本文将深入探讨Java中如何进行四舍五入,并基于提供的`Arith.java`文件,来分析其可能包含的实现方式。 首先,...

    Java实现的浮点类的精确计算

    总结一下,Java中的浮点数精确计算主要是通过`java.math.BigDecimal`类来实现的,而"Java实现的浮点类的精确计算"则可能是一个自定义工具类,封装了`BigDecimal`的操作,以提供方便、准确的浮点数计算服务。...

    js四舍五入-保留两位小数

    在Java中,可以使用`BigDecimal`类来实现四舍五入并保留两位小数的功能。`BigDecimal`类提供了非常强大的高精度算术运算能力,非常适合处理财务计算等场景。 **示例代码**: ```java import java.math.BigDecimal;...

    Java 精确计算-double-float-String

    标题中的"Java 精确计算 - double-float-String"指向的是Java中处理浮点数(double和float)以及字符串表示的数值时可能遇到的精度问题,以及如何通过特定方法实现精确计算。描述中提到的链接指向了一个具体的博客...

    Java Double相加出现的怪事

    我们可以使用以下代码来实现四舍五入: ```java public double round(double value) { return Math.round(value * 100) / 100.0; } ``` 然而,这个方法并不能正常工作。例如,给这个方法传入 4.015,它将返回 ...

    Java Double 精度问题总结

    2. **四舍五入方法**:对于某些应用来说,简单的四舍五入可能就足够了。例如,可以使用 `BigDecimal` 的 `setScale` 方法来指定需要保留的小数位数。 ```java public static double round(double value, int ...

    sishewuru.rar_四舍五入

    标题 "sishewuru.rar_四舍五入" 暗示了我们关注的主题是关于数值计算中的四舍五入操作。在这个主题下,我们将深入探讨四舍五入的定义、用途、方法以及在编程中实现四舍五入的常见算法。 四舍五入是一种在数学和...

    java 四舍五入保留小数的实现方法

    在Java编程语言中,有时我们需要对浮点数进行四舍五入操作,以便在特定场景下得到精确的小数值。以下是一些常用的Java四舍五入保留小数的实现方法: ### 方法一:使用`BigDecimal` `BigDecimal`是Java中处理高精度...

    Java中实现浮点数的精确计算

    - **转换为`double`或`float`**:如果需要将`BigDecimal`对象转换回`double`或`float`类型,可以通过调用相应的转换方法实现,但在转换之前最好先进行适当的四舍五入处理。 通过上述方法,可以在Java中实现浮点数...

    解析Java中的精确计算方法.pdf

    常用的舍入模式包括CEILING(向正无穷方向舍入)、FLOOR(向负无穷方向舍入)、HALF_UP(四舍五入)等。选择合适的舍入模式对于获得正确的计算结果至关重要。 此外,对BigDecimal对象进行操作,相较于基本的数值...

    test2_JavaDouble类型比较大小_java编程_

    标题"test2_JavaDouble类型比较大小_java编程_"提示我们关注的是Java中`Double`类型的比较操作。通常,我们可能会像处理整数那样直接使用`&gt;`或`来比较两个`Double`值,例如`double a = 0.1; double b = 0.2; if (a +...

    Java四舍五入时保留指定小数位数的五种方式

    在Java编程语言中,对数字进行四舍五入并保留指定的小数位数是常见的需求。以下是五种不同的方法来实现这一目标: 1. **使用`BigDecimal`类**: `BigDecimal`是Java中用于处理高精度、大数值计算的类,提供了多种...

    java数学计算工具类 double精确的加法算法 double精确的减法算法

    java数学计算工具类 double精确的加法算法 double精确的减法算法 精确的乘法算法 对精确的除法运算,当发生除不尽的 保留小数、数值精度

    精确计算工具类

    * (由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精确的浮点数运算,包括加减乘除和四舍五入) * @author chenke * @time 2017/12/5 16:22 * @mail ch_chenke@163.com */ public class Arith...

    Java 基本类型double精度计算工具

    该工具用户进行double类型的精度计算,包含加法、减法、乘法、除法、精确点计算、小数点计算,限制小数点后数字

    java_double_精度

    我们首先将 double 类型的数据转换为 BigDecimal 对象,然后使用 setScale 方法来设置精度位数和 roundingMode。最后,我们将 BigDecimal 对象转换回 double 类型的数据。 此外,我们还可以使用 BigDecimal 类来...

    java 四舍五入使java保留2位小数示例讲解

    在Java编程语言中,四舍五入是一种常见的数学操作,特别是在处理浮点数时,我们可能需要将结果精确到特定的小数位数。本示例将深入讲解如何使用Java实现四舍五入并保留两位小数。这在财务计算、统计分析和其他需要...

    double类型,精确的数据运算

    标签“精确计算”进一步确认了这个类包的功能,它专注于提供无舍入误差的计算方法,以确保结果的准确性。这通常包括加法、减法、乘法、除法以及更复杂的数学运算。 压缩包子文件"Arith"可能包含了这个精确计算类库...

Global site tag (gtag.js) - Google Analytics