<<Effective Java>>这本书中提到,float和double只能用来做科学计算或者
是工程计算,在商业计算中我们要用 java.math.BigDecimal。BigDecimal,一共有4个够造
方法,如果需要精确计算,非要用String来够造BigDecimal不可!
给一个网上的流传的工具类Arith:
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();
}
}
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();
}
}
记住,一定要用Double和double!
分享到:
相关推荐
DECIMAL 和 NUMERIC 类型用于存储精确的数值,适合财务计算。FLOAT 和 DOUBLE 用于存储近似数值,与 Java 中的浮点类型相对应。BIT 类型用于存储位字段值,适用于二进制数据。 2. 日期和时间类型:MySQL 的日期和...
当顾客支付的金额超过商品价格时,应如何计算正确的找零额。 **原程序实现**: ```java public class Change { public static void main(String[] args) { System.out.println(2.00 - 1.10); } } ``` **问题解析...
通过实际案例,如预测股票价格、垃圾邮件检测或图像分类,书中将展示如何将所学应用于实际问题,帮助读者巩固理论知识并提升解决实际问题的能力。 七、模型评估与调优 这部分会介绍交叉验证、网格搜索、模型选择...
15. **price**: 价格,可以用于商业计算。 16. **score**: 得分,常用于游戏或评估系统。 17. **money**: 钱,金融相关的数值。 18. **sex**: 性别,通常用于用户信息。 19. **before**: 在...之前,常用于比较或...
#### 二、货币计算中的找零问题 **题目背景:** 在处理货币计算时,经常会涉及到找零的情况。例如,顾客支付的金额大于商品价格时,需要计算应找回的零钱数额。由于浮点数的精度限制,这类计算往往会出现意想不到的...
推荐使用BigDecimal来表示价格,以保证精确计算,避免因浮点数运算导致的精度损失。如果对性能和内存有较高要求,可考虑使用预定义精度的double类型。 8) **Busy Spin** Busy Spin是一种在不释放CPU的情况下等待...
5. **system** - 系统:`System`是Java中的一个内置类,提供了一些系统级的操作,如标准输入输出。 6. **out** - 输出:`System.out`用于输出信息到控制台。 7. **print** - 打印:`print`方法用于将文本打印到...
12、输入一个数据n,计算斐波那契数列(Fibonacci)的第n个值 1 1 2 3 5 8 13 21 34 规律:一个数等于前两个数之和 //计算斐波那契数列(Fibonacci)的第n个值 public class Fibonacci{ public static void main...
在提供的文件名 `EsPiPelineAggFilterForAggValueBucketTest.java` 中,可以看出这是一个关于管道聚合和过滤的单元测试。在 Java 客户端中,我们可以编写这样的测试来验证我们的聚合和过滤逻辑是否正确。这个测试...
在这些Java考试试题中,我们可以看到涉及多个Java编程的基础知识点,包括数组操作、类与对象、日期处理、异常处理以及方法的使用。下面将逐一详细解释这些知识点。 1. **数组操作与条件判断**: - 这道题目要求...
以上内容总结了《计算机组成原理》课程中关于计算机基本概念、硬件组成、指令与程序、存储器、软件等方面的基础知识,以及第二章中关于数字表示、补码运算和浮点数表示的具体示例,帮助学生深入理解这些核心概念。
计算机二级等级考试试题涵盖了许多IT基础知识,包括编程语言(如Java)、操作系统(如Windows)、数据库(如MySQL)、软件应用(如Word和PowerPoint)以及计算机系统原理等方面。以下是这些题目涉及的知识点的详细...
在Java中,选择合适的数据类型来表示价格是非常重要的。通常,如果不关心内存和性能,推荐使用`BigDecimal`类,因为它提供了精确的浮点数运算,适合处理货币计算。而如果性能是关键,可以使用预定义精度的`double`...
- **数字计算机**:数字计算机则使用离散值(通常是二进制形式)来表示数据,所有计算都是基于离散的步骤完成的。它的特点是计算精确且可靠,适用于处理各种类型的数字信息。 两种类型计算机的主要区别可以从以下几...
- 在程序中,定义了五个商品的价格,使用了`double`类型来存储商品的价格,如`toothbrush`、`towel`等,以精确地表示货币值。 2. **输出与格式化**: - 使用`System.out.println()`方法打印商品列表和相关信息,...
它们使用电压来表示数据,通过电压组合和测量值来进行计算。这种方式适合于处理物理世界中的连续变化信号,如声音和图像信号。 2. **数字计算机**的主要特点是按位运算,并且不连续地跳动计算。它们使用数字`0`和`1...
模拟计算机的核心特点是其数值表示以及运算过程都是连续的,通常采用电压来表示数据,通过电压组合和测量值来进行计算,通过盘上连线的方式来控制。而数字计算机则采取离散的表示方法,使用数字`0`和`1`来表示数据,...
- **解析**:在 Java 中,使用 “==” 比较字符串时,实际上比较的是两个对象的引用是否相同,而不是字符串的值。要比较字符串的值,应该使用 `.equals()` 方法。 #### 28. 查询准则 - **题目描述**:使用文本值...
模拟计算机使用电压来表示数据,并通过电压组合和测量值来进行计算。其控制方式主要依赖于面板上的连线。 - **数字计算机**则是基于离散的0和1来表示数据,并采用位运算的方式进行计算。它具有更高的精确度、更大的...