`
liudeh_009
  • 浏览: 242750 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

BigDecimal在实际项目的应用及遇到的问题

    博客分类:
  • JDK
阅读更多

      我们都知道,java中对大小数,高精度的计算都会用到BigDecimal.但是在实际应用中,运用BigDecimal还是会遇到一些问题.下面说一下我在项目中怎么样BigDecimal和遇到的一些问题. 

 

       1. 对商品的价格进行格式化,比如所有商品的价格保留两位小数

      

    /**
     * 
     * @param bd  商品的价格
     * @param num 保留几位小数,如num = 2
     * @return
     */
    public static String formatPrice(BigDecimal bd,int num){
        if(bd == null || num < 0){
            return null;
        }
        bd = bd.setScale(num, BigDecimal.ROUND_HALF_UP);
        return bd + "";
    }

       其中BigDecimal.ROUND_HALF_UP表示采用"四舍五入"的模式处理价格

 

  2. 将商品的价格由元转为分,便于前端分隔展现

   

    /**
     * 元转换为分
     * @param bd 商品的价格
     * @return
     */
    public static String yuanToCent(BigDecimal bd){
        if(bd == null){
            return null;
        }
        bd = bd.multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_HALF_EVEN);
        return bd + "";
    }

       其中setScale(0, BigDecimal.ROUND_HALF_EVEN)表示采用"四舍五入"的模式处理价格,并且结果不保留小数.

 

  3. 获取缓存命中率

     

   
   /**
    * 缓存命中率
    * @return
    */
   public static String getHitRate(){
       BigDecimal a = new BigDecimal(cacheCount.longValue()*100);
       BigDecimal b = new BigDecimal(sumCount.longValue());
       if(sumCount.longValue() > 0){
           return "%" + (a.divide(b, 2, BigDecimal.ROUND_HALF_EVEN)); 
       }
       return "0";
   }

 

  4. BigDecimal中对于等于"0"的判断

          在 BigDecimal中,new BigDecimal("0")与new BigDecimal("0.0"),new BigDecimal(0)与new BigDecimal("0.0")都是不等的.但是本质上,它们都是"0".怎么对是否等于"0"进行判断?将BigDecimal类型的值通过调用doubleValue()方法转换为double类型进行比较或通过上面的方法yuanToCent转换一下比较就能解决这个问题.

 

    5.  用BigDecimal进行除法计算时抛出java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result异常.

       比如用new BigDecimal(30).divide(new BigDecimal(7))就会抛这个异常,异常原因:BigDecimal的divide方法进行除法时当不整除,出现无限循环小数时,就会抛这个异常.

      解决办法:给divide设置精确的小数点位数或"舍入"模式,如

            new BigDecimal(30).divide(new             BigDecimal(7),BigDecimal.ROUND_HALF_UP).setScale(2,BigDecimal.ROUND_HALF_UP)或

                  new BigDecimal(30).divide(new BigDecimal(7),2,BigDecimal.ROUND_HALF_UP)

     建议采用第二种方式,因为第二种方式的结果精度更高

      

    另外,要注意BigDecimal跟String一样,是不可改变的,比如BigDecimal对象执行setScale(), add()等操作都会返回一个新的BigDecimal.

 

 

5
3
分享到:
评论
8 楼 hellostory 2013-03-29  
liudeh_009 写道
hellostory 写道
liudeh_009 写道
hellostory 写道
引用
  4. BigDecimal中对于等于"0"的判断


System.out.println(new BigDecimal("0").compareTo(new BigDecimal("0.0")));

PS:前台打印BigDecimal数据时,若有小数点,则小数点后面可能会出现很多个0,你怎么处理的?

setScale方法可以设置包含小数点的位数


这我知道,但有一个问题:比如后台需要精度达到6个小数点,如果你设置精度为6位小数,那么前台显示时,你会发现“5.67”仍然会显示“5.670000”


如果只是想把后面没有意义的0去掉,把结果转成double类型输出就可以了


所有就得多写一个FormBean,或多个字段等
7 楼 liudeh_009 2013-03-29  
hellostory 写道
liudeh_009 写道
hellostory 写道
引用
  4. BigDecimal中对于等于"0"的判断


System.out.println(new BigDecimal("0").compareTo(new BigDecimal("0.0")));

PS:前台打印BigDecimal数据时,若有小数点,则小数点后面可能会出现很多个0,你怎么处理的?

setScale方法可以设置包含小数点的位数


这我知道,但有一个问题:比如后台需要精度达到6个小数点,如果你设置精度为6位小数,那么前台显示时,你会发现“5.67”仍然会显示“5.670000”


如果只是想把后面没有意义的0去掉,把结果转成double类型输出就可以了
6 楼 hellostory 2013-03-28  
liudeh_009 写道
hellostory 写道
引用
  4. BigDecimal中对于等于"0"的判断


System.out.println(new BigDecimal("0").compareTo(new BigDecimal("0.0")));

PS:前台打印BigDecimal数据时,若有小数点,则小数点后面可能会出现很多个0,你怎么处理的?

setScale方法可以设置包含小数点的位数


这我知道,但有一个问题:比如后台需要精度达到6个小数点,如果你设置精度为6位小数,那么前台显示时,你会发现“5.67”仍然会显示“5.670000”

5 楼 liudeh_009 2013-03-28  
hellostory 写道
引用
  4. BigDecimal中对于等于"0"的判断


System.out.println(new BigDecimal("0").compareTo(new BigDecimal("0.0")));

PS:前台打印BigDecimal数据时,若有小数点,则小数点后面可能会出现很多个0,你怎么处理的?

setScale方法可以设置包含小数点的位数
4 楼 liudeh_009 2013-03-28  
java_林 写道
第4条没
new BigDecimal("0.0"),new BigDecimal(0)

不等是指业务上还是程序上?compareTo方法呢?

程序上的,我以前不知道可以用compareTo,现在发现用compareTo比较更简单,刚才查了一下,发现compareTo方法不需要两个BigDecimal值具有相同的精度就可以比较大小
3 楼 java_林 2013-03-28  
第4条没
new BigDecimal("0.0"),new BigDecimal(0)

不等是指业务上还是程序上?compareTo方法呢?
2 楼 hellostory 2013-03-28  
引用
  4. BigDecimal中对于等于"0"的判断


System.out.println(new BigDecimal("0").compareTo(new BigDecimal("0.0")));

PS:前台打印BigDecimal数据时,若有小数点,则小数点后面可能会出现很多个0,你怎么处理的?
1 楼 ooo456mmm 2013-03-27  
还要注意一点:
在构造BigDecimal的时候,尽量使用“”将数据引起来(特别是小数),否则会出现计算不准确的问题
在做除法的时候,new BigDecimal(30).divide(new BigDecimal(7),2,BigDecimal.ROUND_HALF_UP),这种精度高。

相关推荐

    js_bigdecimal_1_0_1.zip

    在JavaScript中,大数计算通常会遇到精度问题,因为JavaScript的Number类型在处理超过一定位数的数值时会出现精度丢失。为了解决这个问题,开发者引入了BigDecimal库,它提供了高精度的大数运算支持。"js_bigdecimal...

    BigDecimal加减乘除计算

    BigDecimal 类在 Java 中被设计用来处理高精度的浮点数运算,主要应用于财务、金融等领域,因为这些场景中对精度要求非常高。BigDecimal 提供了加法(add())、减法(subtract())、乘法(multiply())和除法...

    java中BigDecimal的操作方法

    在进行商业计算时,由于浮点数(double和float)存在精度问题,不能保证准确的结果,因此通常推荐使用BigDecimal来确保计算的精确性。本文将深入探讨BigDecimal的基本操作、应用场景及注意事项。 首先,创建...

    BigInteger BigDecimal 使用

    `BigDecimal`类则用于处理高精度的浮点数运算,它解决了`float`和`double`类型存在的精度问题。`BigDecimal`的构造方法同样接受字符串,或者可以通过`BigInteger`来创建: ```java BigDecimal bigDec = new ...

    高精度JSBigDecimal运算

    在实际应用中,使用这样的库可以避免JavaScript原生数据类型带来的精度问题。例如,在电商网站进行价格计算时,可以确保小数部分的正确性,防止因精度问题导致的金额计算错误。在科学计算中,高精度的BigDecimal运算...

    jackson使用@JsonSerialize格式化BigDecimal解决.00不显示问题

    在本案例中,开发者遇到的问题是,前端期望从后端获取的JSON数据中,BigDecimal类型的数值能够保留两位小数,但实际返回的数据丢失了小数部分。 问题的根源在于,默认情况下,Jackson在序列化BigDecimal到JSON字符...

    java中BigDecimal进行加减乘除的基本用法

    `BigDecimal` 是为那些需要精确数值计算的场景设计的,比如金融计算或会计应用,因为普通的 `float` 和 `double` 类型在进行大数或高精度计算时会存在精度损失。 当需要进行加减乘除操作时,`BigDecimal` 不支持...

    java代码-BigDecimal转String

    今天我们将深入探讨如何将`BigDecimal`对象转换为`String`,以及在这个过程中可能遇到的问题和解决方案。 首先,`BigDecimal`到`String`的最直接转换方式是使用`toString()`方法。这个方法会以标准的十进制格式返回...

    实践《Effective Java》书中的经验法则示例代码,结合Java源码来理解这些最佳实践,并应用于实际项目。.zip

    这个压缩包包含了作者在书中提到的一些示例代码,通过分析和实践这些代码,我们可以深入理解这些最佳实践,并将其应用到实际的Java项目中。以下是关于这些经验法则的详细解释: 1. **使用接口而非具体类(Item 2)*...

    【Java】BigDecimal实现加减乘除运算代码

    在实际应用中,`BigDecimal`不仅可以用于基本的数学运算,还可以用于金融、财务等需要精确计算的场景。其灵活性和可配置性使得我们可以根据需求调整精度和舍入策略,避免了由于浮点数运算导致的不准确性。在处理大数...

    Calculator:BigDecimal类的便捷包装器,允许计算运算忽略乘和除零的影响

    在实际应用中,尤其是在财务计算、科学计算等领域,这种能够处理边缘情况的类是非常有价值的。 为了进一步了解Calculator的具体实现和用法,你可以查看名为`Calculator-master`的压缩包文件,其中应该包含了...

    Java中BigDecimal类与int、Integer使用总结

    在实际应用中,为了确保商业运算的精确性,建议始终使用`BigDecimal(String)`构造器来创建`BigDecimal`实例,并且谨慎处理类型转换。`BigDecimal`虽然提供了精确计算的能力,但它的性能相对较低,不适合大量快速计算...

    两个数判断:小于、大于、等于程序

    在VB6.0编程环境中,我们经常会遇到比较两个数值大小的情况。这通常涉及到基本的逻辑判断,例如小于、大于和等于。在这个“两个数判断:小于、大于、等于程序”中,我们将深入探讨如何利用VB6.0的源代码来实现这样的...

    Java中如何正确进行浮点数运算

    在Java编程中,浮点数运算常常会遇到精度问题,这是由于浮点数在计算机内部的存储方式导致的。为了确保浮点数运算的准确性,开发者需要采取特定的方法。以下将详细阐述这个问题,并提供正确的处理策略。 首先,理解...

    Java使用BigDecimal进行高精度计算的示例代码

    在实际应用中,可以提供工具类来进行精确的浮点数运算,包括加减乘除和四舍五入。例如: import java.math.BigDecimal; public class ArithUtil { private static final int DEF_DIV_SCALE = 6; // 默认除法运算...

    android精度显示

    在实际项目中,开发者可能需要结合这些操作来实现更复杂的计算逻辑。此外,为了优化性能,避免不必要的内存分配,还可以利用BigDecimal的静态方法`valueOf()`来复用已存在的BigDecimal对象。 总之,通过BigDecimal...

    bigNumber:用于将BigDecimal和BigInteger结合在一起的Java的bignum库

    然而,在实际应用中,我们可能需要同时处理这两种类型的大数,这时`bigNumber`库就显得尤为重要。 `bigNumber`库是一个Java库,它的设计目标是将`BigInteger`和`BigDecimal`的功能集成在一起,使得开发者能够更方便...

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

    在Java编程中,使用`float`和`double`类型进行浮点数计算时经常会遇到精度丢失的问题。这是因为浮点数在计算机内部是以二进制形式存储的,而某些十进制小数无法用二进制精确表示,从而导致计算结果出现误差。例如,`...

    java问题及对策

    Java编程语言在实际应用中经常会遇到各种问题,尤其是在处理字符编码、数据取整以及用户交互等方面。以下是对这些常见问题的详细分析和解决方案。 一、Jsp 页面中 request 获取的中文参数是乱码 在Java Web开发中...

    JAVA程序设计报告.doc

    这个报告详细介绍了这样一个计算器项目的实施过程,涵盖了设计思路、实现方法和实验结果,同时也包含了设计者在实践过程中遇到的问题和解决策略。 1. **课题概述** 1.1 **课题任务**:本项目的任务是构建一个功能...

Global site tag (gtag.js) - Google Analytics