我们都知道,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.
相关推荐
在JavaScript中,大数计算通常会遇到精度问题,因为JavaScript的Number类型在处理超过一定位数的数值时会出现精度丢失。为了解决这个问题,开发者引入了BigDecimal库,它提供了高精度的大数运算支持。"js_bigdecimal...
BigDecimal 类在 Java 中被设计用来处理高精度的浮点数运算,主要应用于财务、金融等领域,因为这些场景中对精度要求非常高。BigDecimal 提供了加法(add())、减法(subtract())、乘法(multiply())和除法...
在进行商业计算时,由于浮点数(double和float)存在精度问题,不能保证准确的结果,因此通常推荐使用BigDecimal来确保计算的精确性。本文将深入探讨BigDecimal的基本操作、应用场景及注意事项。 首先,创建...
`BigDecimal`类则用于处理高精度的浮点数运算,它解决了`float`和`double`类型存在的精度问题。`BigDecimal`的构造方法同样接受字符串,或者可以通过`BigInteger`来创建: ```java BigDecimal bigDec = new ...
在实际应用中,使用这样的库可以避免JavaScript原生数据类型带来的精度问题。例如,在电商网站进行价格计算时,可以确保小数部分的正确性,防止因精度问题导致的金额计算错误。在科学计算中,高精度的BigDecimal运算...
在本案例中,开发者遇到的问题是,前端期望从后端获取的JSON数据中,BigDecimal类型的数值能够保留两位小数,但实际返回的数据丢失了小数部分。 问题的根源在于,默认情况下,Jackson在序列化BigDecimal到JSON字符...
`BigDecimal` 是为那些需要精确数值计算的场景设计的,比如金融计算或会计应用,因为普通的 `float` 和 `double` 类型在进行大数或高精度计算时会存在精度损失。 当需要进行加减乘除操作时,`BigDecimal` 不支持...
今天我们将深入探讨如何将`BigDecimal`对象转换为`String`,以及在这个过程中可能遇到的问题和解决方案。 首先,`BigDecimal`到`String`的最直接转换方式是使用`toString()`方法。这个方法会以标准的十进制格式返回...
这个压缩包包含了作者在书中提到的一些示例代码,通过分析和实践这些代码,我们可以深入理解这些最佳实践,并将其应用到实际的Java项目中。以下是关于这些经验法则的详细解释: 1. **使用接口而非具体类(Item 2)*...
在实际应用中,`BigDecimal`不仅可以用于基本的数学运算,还可以用于金融、财务等需要精确计算的场景。其灵活性和可配置性使得我们可以根据需求调整精度和舍入策略,避免了由于浮点数运算导致的不准确性。在处理大数...
在实际应用中,尤其是在财务计算、科学计算等领域,这种能够处理边缘情况的类是非常有价值的。 为了进一步了解Calculator的具体实现和用法,你可以查看名为`Calculator-master`的压缩包文件,其中应该包含了...
在实际应用中,为了确保商业运算的精确性,建议始终使用`BigDecimal(String)`构造器来创建`BigDecimal`实例,并且谨慎处理类型转换。`BigDecimal`虽然提供了精确计算的能力,但它的性能相对较低,不适合大量快速计算...
在VB6.0编程环境中,我们经常会遇到比较两个数值大小的情况。这通常涉及到基本的逻辑判断,例如小于、大于和等于。在这个“两个数判断:小于、大于、等于程序”中,我们将深入探讨如何利用VB6.0的源代码来实现这样的...
在Java编程中,浮点数运算常常会遇到精度问题,这是由于浮点数在计算机内部的存储方式导致的。为了确保浮点数运算的准确性,开发者需要采取特定的方法。以下将详细阐述这个问题,并提供正确的处理策略。 首先,理解...
在实际应用中,可以提供工具类来进行精确的浮点数运算,包括加减乘除和四舍五入。例如: import java.math.BigDecimal; public class ArithUtil { private static final int DEF_DIV_SCALE = 6; // 默认除法运算...
在实际项目中,开发者可能需要结合这些操作来实现更复杂的计算逻辑。此外,为了优化性能,避免不必要的内存分配,还可以利用BigDecimal的静态方法`valueOf()`来复用已存在的BigDecimal对象。 总之,通过BigDecimal...
然而,在实际应用中,我们可能需要同时处理这两种类型的大数,这时`bigNumber`库就显得尤为重要。 `bigNumber`库是一个Java库,它的设计目标是将`BigInteger`和`BigDecimal`的功能集成在一起,使得开发者能够更方便...
在Java编程中,使用`float`和`double`类型进行浮点数计算时经常会遇到精度丢失的问题。这是因为浮点数在计算机内部是以二进制形式存储的,而某些十进制小数无法用二进制精确表示,从而导致计算结果出现误差。例如,`...
Java编程语言在实际应用中经常会遇到各种问题,尤其是在处理字符编码、数据取整以及用户交互等方面。以下是对这些常见问题的详细分析和解决方案。 一、Jsp 页面中 request 获取的中文参数是乱码 在Java Web开发中...
这个报告详细介绍了这样一个计算器项目的实施过程,涵盖了设计思路、实现方法和实验结果,同时也包含了设计者在实践过程中遇到的问题和解决策略。 1. **课题概述** 1.1 **课题任务**:本项目的任务是构建一个功能...