`

java中金额的精确计算问题

阅读更多
import java.math.BigDecimal;   
  
  
  
/** *//**  
 
* 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精  
 
* 确的浮点数运算,包括加减乘除和四舍五入。  
 
*/  
  
public class Arith{   
  
  
  
//默认除法运算精度   
  
private static final int DEF_DIV_SCALE = 10;   
  
  
  
//这个类不能实例化   
  
private Arith(){   
  
}   
  
  
  
  
  
/** *//**  
 
* 提供精确的加法运算。  
 
* @param v1 被加数  
 
* @param v2 加数  
 
* @return 两个参数的和  
 
*/  
  
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();   
  
}   
  
  
  
/** *//**  
 
* 提供精确的减法运算。  
 
* @param v1 被减数  
 
* @param v2 减数  
 
* @return 两个参数的差  
 
*/  
  
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();   
  
}   
  
  
  
/** *//**  
 
* 提供精确的乘法运算。  
 
* @param v1 被乘数  
 
* @param v2 乘数  
 
* @return 两个参数的积  
 
*/  
  
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();   
  
}   
  
  
  
/** *//**  
 
* 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到  
 
* 小数点以后10位,以后的数字四舍五入。  
 
* @param v1 被除数  
 
* @param v2 除数  
 
* @return 两个参数的商  
 
*/  
  
public static double div(double v1,double v2){   
  
return div(v1,v2,DEF_DIV_SCALE);   
  
}   
  
  
  
/** *//**  
 
* 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指  
 
* 定精度,以后的数字四舍五入。  
 
* @param v1 被除数  
 
* @param v2 除数  
 
* @param scale 表示表示需要精确到小数点以后几位。  
 
* @return 两个参数的商  
 
*/  
  
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();   
  
}   
  
  
  
/** *//**  
 
* 提供精确的小数位四舍五入处理。  
 
* @param v 需要四舍五入的数字  
 
* @param scale 小数点后保留几位  
 
* @return 四舍五入后的结果  
 
*/  
  
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版) #### 概述 本文将详细介绍一个Java程序,该程序用于将小写的人民币金额转换为大写形式。此转换主要用于财务、会计和其他正式场合,在这些场合中,大写金额是标准且必须的...

    金钱大写转小写数字类java(精确到角)

    在IT行业中,尤其是在财务软件开发或者处理金融数据时,经常需要进行金额的格式转换,将中文大写的金额转换成小写数字。这是因为中文大写数字在财务领域中使用广泛,可以防止数字篡改,增强账目的安全性。本节将详细...

    Java编程中须注意的细节.pdf

    2. 小数的精确计算问题 在Java中,使用浮点数(如float和double)进行计算时可能会出现精度问题。由于二进制浮点数不能精确地表示一些十进制小数,例如1.1在二进制中无法精确表示,所以进行浮点数计算时需要注意其...

    java自学资料

    9:java中金额的精确计算问题 10:有关继承的要点 11:有关继承的问题 12;有关static、final的基本规则 13:有关数组的知识点 14:数组的拷贝 15:数组中插入法实现排序 16:Object类 1)、equals与==的区别 17:如何判断...

    Java开发的发票打印

    在本文中,我们将深入探讨Java如何用于开发此类应用程序,以及相关的关键知识点。 首先,让我们了解Java语言在处理打印任务时的优势。Java具有跨平台的特性,这意味着同一段代码可以在多种操作系统上运行,如...

    Java钱币大小写转换

    这是因为double类型在精度上可能存在问题,尤其是在小数部分,而long类型可以提供更精确的整数计算能力。 2. **字符串分割与处理**: - 将转换后的long型数值转换为字符串,并分割成整数部分和小数部分。 - 整数...

    java中BCD编码

    使得在计算机内部处理时能够更高效地进行十进制运算,尤其在处理金融数据时更为常见,因为它可以精确地存储和计算小数点后的位数,避免浮点数计算中可能出现的精度问题。 BCD编码的基本原理是将每一位十进制数用4位...

    java数学库文件科学计算jscience

    1. **数学运算**:JScience提供了高级数学函数,如复数运算、矩阵和向量操作、数值积分、微积分、概率统计等,使得Java开发者可以在程序中进行复杂的数学计算。 2. **物理量与单位**:JScience支持国际单位制(SI)...

    金钱大写转数字类型,精确到分

    通过阅读和理解这个代码,开发者可以学习到如何处理特定的财务数据转换问题,以及如何在Java中编写高效的字符串处理和映射查找算法。 总结来说,将汉字大写金额转换为数字类型是一个常见的财务编程任务,它涉及到...

    经典 java 解 惑

    #### 二、货币计算中的二进制浮点数问题 **标题与描述中的知识点:** 这部分内容涉及到Java中使用二进制浮点数进行货币计算时可能出现的问题。 **详细说明:** 货币计算通常需要非常高的精度,但二进制浮点数无法...

    JAVA解惑(JAVA谜题) 中文版(PDF)

    ### JAVA解惑中的关键知识点解析 ...3. **浮点数的精度问题**:使用浮点数进行精确计算时需格外小心,尤其是货币计算,最好使用`BigDecimal`类来避免精度问题。 这些知识点对于理解和编写高质量的Java程序至关重要。

    Java电话计费卡程序源代码

    通过阅读和理解这些代码,你可以学习到如何在Java中实现面向对象编程,处理时间和金钱的计算,以及如何设计和组织类的结构。 总的来说,这个Java实验提供了一个实践性的机会,让你深入理解Java编程语言,同时也能...

    购车贷款程序设计JAVA

    在实现过程中,需要将年利率转换为月利率,同时确保所有的计算结果精确到小数点后几位,避免因为浮点数运算导致的精度问题。这可能需要用到`BigDecimal`类来处理高精度计算。 接下来,我们关注用户界面设计。在JAVA...

    Joda-Money-用于表示货币金额的Java库

    `Money`类支持精确的数值运算,避免了浮点数计算中可能出现的精度问题。此外,`Money`还支持不同的货币代码(如ISO 4217),确保了全球货币的正确表示。 ### 2. 创建与初始化 创建`Money`对象可以通过以下几种方式...

    JAVA解惑 大量java实例 Java程序员阅读

    在上述示例中,尝试计算找零金额时,使用了`System.out.println(2.00 - 1.10);`。尽管期望输出是0.90,但实际上输出的是0.***。这是因为1.10不能被精确表示为二进制浮点数,所以在计算机中存储的是最接近的值。 ...

    JAVA实现数字大写金额转换的方法

    在财务报告或银行系统中,将阿拉伯数字金额转换为中文大写金额是一个常见的需求,这不仅提高了信息的可读性,还增强了数据的安全性,因为在金融领域,对于大额交易的书写和审核更为严谨,使用中文大写金额形式可以...

    Java POI读取excel中数值精度损失问题解决

    Java POI 读取 Excel 中数值精度损失问题解决 Java POI 读取 Excel 中数值精度损失问题解决是指在使用 Java POI 读取 Excel 文件时,遇到数值精度损失的问题。这种问题的出现是因为 Excel 中的数值单元格在读取时,...

    Java解惑(中文)

    为了避免这类问题,建议在处理货币等需要精确计算的场景时,使用整数类型如`int`或`long`来存储货币金额(以分为单位),并避免使用浮点数。 ```java public class Change { public static void main(String[] ...

    微信随机生成红包金额算法java版

    `HongBao`类中的`hb`方法采用`BigDecimal`处理精度问题,这在处理货币计算时非常重要,因为它可以避免浮点数计算中的精度丢失问题。测试方法`testHonbao`模拟了抢红包的场景,调用`hb`方法分配红包。 以上三种实现...

    java贷款计算器

    首先,`BigDecimal`是Java中的一个核心类,用于进行精确的浮点数运算。在处理金钱和贷款计算时,由于浮点数运算可能存在精度问题,使用`BigDecimal`可以避免因四舍五入导致的误差,确保计算结果的准确性。例如,在...

Global site tag (gtag.js) - Google Analytics