由于计算机在计算过程中的舍入关系,普通的计算和工程计算可能会出现计算不足够精确的情况,这种情况在这两种计算中也许是可以忍受的,但是在商务运算中就不可接受了,财务计算。
//import org.zym.arithutil.Arith;
public class FloatCalculation {
/**
* @param args
*/
public static void main(String[] args) {
System.out.println(0.05 + 0.01);
// System.out.println(Arith.add(0.05,0.01));
System.out.println(4.015 * 100);
// System.out.println(Arith.mul(4.015,100));
}
}
其计算结果:
0.060000000000000005
401.49999999999994
这显然是不能接受的。
下面给出一个算术类工具来解决这个问题,基本原则是使用java.math.BigDecimal类来进行加减乘除的运算封装。
package org.zym.arithutil;
import java.math.BigDecimal;
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();
}
}
看下面的代码:
import org.zym.arithutil.Arith;
public class FloatCalculation {
/**
* @param args
*/
public static void main(String[] args) {
System.out.println(0.05 + 0.01);
System.out.println(Arith.add(0.05,0.01));
System.out.println(4.015 * 100);
System.out.println(Arith.mul(4.015,100));
}
}
对比计算结果如下: 写道
0.060000000000000005
0.06
401.49999999999994
401.5
得到了令人满意的效果,其他两种计算大家可以自己测试,这样就解决了一些要求精确的商务谁计算的问题,整理下,以方便大家和自己使用。
:-s
分享到:
相关推荐
Java编程语言在计算机软件开发中的应用分析与研究涉及到多方面的核心知识点,包括Java语言的基本概念、主要特征、在软件开发中常用的技术优势和应用领域,以及在不同领域中的应用价值。 首先,Java编程语言是一种...
在Java开发领域,发票打印是一项常见的任务,尤其对于财务软件或者电子商务平台而言。这个特定的项目专注于使用Java语言创建一个能够实现自定义打印功能的发票打印程序。在本文中,我们将深入探讨Java如何用于开发...
9. **税务计算**: 不同国家和地区有不同的税收政策,需要对税率进行精确计算,并确保符合当地的法规。 10. **用户认证与权限管理**: 实现用户注册、登录功能,使用JWT(JSON Web Tokens)进行身份验证,控制不同...
- **大数据处理**:Java因其高性能和稳定性,在大数据处理和分布式计算领域也有广泛应用。 - **游戏开发**:虽然游戏开发更多使用C++等语言,但Java也常用于游戏服务器端逻辑的开发。 综上所述,Java不仅是一种...
在Java中,可以使用如BigDecimal类来处理精确的货币计算,以防止浮点数运算带来的精度问题。同时,为了防止恶意攻击,系统应该遵循安全最佳实践,如输入验证、参数化查询以防止SQL注入,以及使用HTTPS进行安全的数据...
在Java中,常用的数据结构如HashMap可以提供O(1)的查找效率,适合存储地区码和名称的映射关系。如果需要保持顺序,可以选择TreeMap,它按照键的自然排序或者自定义比较器维护有序性。 5. 文件结构: 压缩包内的...
为了玩家有良好的体验感,游戏制作过程中必须要做到精确细致。一个实时运行的程序,随时都要处理大量的数据和计算任务。 5. Java游戏引擎的优点 Java游戏引擎的开发具有很多优点,例如平台无关性、效率高、容易...
"java三级分销源码"指的是基于Java编程语言实现的一种电子商务模式,即三级分销系统。这种系统通常用于电商平台,允许商家通过多级分销商网络进行产品推广和销售,每一级分销商都能获得相应的销售分成。这里的“源码...
论文指出,采用Java EE平台下的SSH(Struts2、Spring、Hibernate)框架,可以有效地处理大规模数据,实现快速、精确的库存管理,减轻人力负担,提高工作效率。 在系统设计与实现中,论文详细描述了如何运用SSH框架...
在电子商务系统设计中,商务逻辑层是至关重要的组成部分,它主要负责将用户的商务需求转化为具体的计算机实施方案。这一层的设计目标是将系统分析阶段抽象出的逻辑方案转化为可执行的物理方案,同时也需考虑如何将其...
- **部署环境**:Java应用程序通常部署在安装了JRE的环境中,这使得Java成为了跨平台部署的理想选择。 **1.2 Java编程语言** - **语言的定义**:虽然很难精确定义何为“语言”,但通常指的是人们用来沟通交流的...
- **JSE (Java Standard Edition)**: 适用于桌面应用和低端商务计算,支持广泛的桌面应用需求。 - **JEE (Java Enterprise Edition)**: 针对企业级应用设计,提供了丰富的API和服务,支持复杂的业务逻辑和高可用性需求...
在Java中,`Math.PI`提供了π的精确值,便于进行圆周率相关的计算。这个练习题加深了编程者对Java数学函数库`Math`类的了解,同时也锻炼了对实际问题转化成程序逻辑的能力。 在2.3节的英尺转换为米的程序中,通过一...
当用户移动时,系统能迅速计算并反馈精确的三维图像,增强沉浸感。 在Web3D应用中,VR技术主要应用于商业、教育、娱乐和虚拟社区。尤其在电子商务中,虚拟产品展示具有显著优势,能全方位展示商品细节,通过互动...
`Money`类支持精确的数值运算,避免了浮点数计算中可能出现的精度问题。此外,`Money`还支持不同的货币代码(如ISO 4217),确保了全球货币的正确表示。 ### 2. 创建与初始化 创建`Money`对象可以通过以下几种方式...
- **Arithmetic operations**:算术运算指加、减、乘、除等基本数学操作,在计算科学和编程中非常重要。 - **Audio output device**:音频输出设备包括扬声器、耳机等,用于播放声音信号。 - **Access time**:访问...
实习性质为顶岗实习,实习生在Java平台上参与了中小型企业管理软件的定制开发,运用了当时主流的框架,承担了设计和编码的角色。 二、实习的性质、目的和意义 毕业实习是教育过程的关键部分,旨在让学生获取实际...
10. 编程语言java:在这三个礼拜的时间中,我复习了曾经学过的编程语言java,让我对 java 在相识的基础上,又具备了用 java 开发 windows 应用程序和 web 应用程序的实力。现在我再去理解和 java,就会发觉 jsp 是个...
简历中的工作经历部分详细列举了程序员在不同公司的工作职责和成就,这有助于招聘者了解其专业技能和实际工作能力。 1. **技术技能**: - Java编程:程序员具备深厚的Java语言功底,能进行后台管理程序的修改和...