`

关于java中精确计算值的问题:如价格

    博客分类:
  • J2SE
阅读更多
<<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!
分享到:
评论

相关推荐

    Java中数据类型和MYSQL中数据类型的对比

    DECIMAL 和 NUMERIC 类型用于存储精确的数值,适合财务计算。FLOAT 和 DOUBLE 用于存储近似数值,与 Java 中的浮点类型相对应。BIT 类型用于存储位字段值,适用于二进制数据。 2. 日期和时间类型:MySQL 的日期和...

    JAVA解惑 中文pdf版

    当顾客支付的金额超过商品价格时,应如何计算正确的找零额。 **原程序实现**: ```java public class Change { public static void main(String[] args) { System.out.println(2.00 - 1.10); } } ``` **问题解析...

    机器学习算法-java版

    通过实际案例,如预测股票价格、垃圾邮件检测或图像分类,书中将展示如何将所学应用于实际问题,帮助读者巩固理论知识并提升解决实际问题的能力。 七、模型评估与调优 这部分会介绍交叉验证、网格搜索、模型选择...

    Java初学者基础英语单词表

    15. **price**: 价格,可以用于商业计算。 16. **score**: 得分,常用于游戏或评估系统。 17. **money**: 钱,金融相关的数值。 18. **sex**: 性别,通常用于用户信息。 19. **before**: 在...之前,常用于比较或...

    Java 谜题解惑

    #### 二、货币计算中的找零问题 **题目背景:** 在处理货币计算时,经常会涉及到找零的情况。例如,顾客支付的金额大于商品价格时,需要计算应找回的零钱数额。由于浮点数的精度限制,这类计算往往会出现意想不到的...

    Java程序员面试题集锦-java程序员面试试题与解析doc精品模板.docx

    推荐使用BigDecimal来表示价格,以保证精确计算,避免因浮点数运算导致的精度损失。如果对性能和内存有较高要求,可考虑使用预定义精度的double类型。 8) **Busy Spin** Busy Spin是一种在不释放CPU的情况下等待...

    (完整版)Java基础英语单词表.doc

    5. **system** - 系统:`System`是Java中的一个内置类,提供了一些系统级的操作,如标准输入输出。 6. **out** - 输出:`System.out`用于输出信息到控制台。 7. **print** - 打印:`print`方法用于将文本打印到...

    达内 coreJava 习题答案

    12、输入一个数据n,计算斐波那契数列(Fibonacci)的第n个值 1 1 2 3 5 8 13 21 34 规律:一个数等于前两个数之和 //计算斐波那契数列(Fibonacci)的第n个值 public class Fibonacci{ public static void main...

    elasticsearch聚合值过滤

    在提供的文件名 `EsPiPelineAggFilterForAggValueBucketTest.java` 中,可以看出这是一个关于管道聚合和过滤的单元测试。在 Java 客户端中,我们可以编写这样的测试来验证我们的聚合和过滤逻辑是否正确。这个测试...

    java考试的试题说课.pdf

    在这些Java考试试题中,我们可以看到涉及多个Java编程的基础知识点,包括数组操作、类与对象、日期处理、异常处理以及方法的使用。下面将逐一详细解释这些知识点。 1. **数组操作与条件判断**: - 这道题目要求...

    白中英计算机组成原理课后习题答案

    以上内容总结了《计算机组成原理》课程中关于计算机基本概念、硬件组成、指令与程序、存储器、软件等方面的基础知识,以及第二章中关于数字表示、补码运算和浮点数表示的具体示例,帮助学生深入理解这些核心概念。

    2021-2022计算机二级等级考试试题及答案No.15716.docx

    计算机二级等级考试试题涵盖了许多IT基础知识,包括编程语言(如Java)、操作系统(如Windows)、数据库(如MySQL)、软件应用(如Word和PowerPoint)以及计算机系统原理等方面。以下是这些题目涉及的知识点的详细...

    Java 基础(3-8) - 图谱 & Q-A.pdf

    在Java中,选择合适的数据类型来表示价格是非常重要的。通常,如果不关心内存和性能,推荐使用`BigDecimal`类,因为它提供了精确的浮点数运算,适合处理货币计算。而如果性能是关键,可以使用预定义精度的`double`...

    计算机组成原理课后习题答案

    - **数字计算机**:数字计算机则使用离散值(通常是二进制形式)来表示数据,所有计算都是基于离散的步骤完成的。它的特点是计算精确且可靠,适用于处理各种类型的数字信息。 两种类型计算机的主要区别可以从以下几...

    案例2-3超市购物程序设计.docx

    - 在程序中,定义了五个商品的价格,使用了`double`类型来存储商品的价格,如`toothbrush`、`towel`等,以精确地表示货币值。 2. **输出与格式化**: - 使用`System.out.println()`方法打印商品列表和相关信息,...

    计算机组成原理课后习题答案 白中英 第三版(网络版)

    它们使用电压来表示数据,通过电压组合和测量值来进行计算。这种方式适合于处理物理世界中的连续变化信号,如声音和图像信号。 2. **数字计算机**的主要特点是按位运算,并且不连续地跳动计算。它们使用数字`0`和`1...

    白中英计算机组成原理习题答案

    模拟计算机的核心特点是其数值表示以及运算过程都是连续的,通常采用电压来表示数据,通过电压组合和测量值来进行计算,通过盘上连线的方式来控制。而数字计算机则采取离散的表示方法,使用数字`0`和`1`来表示数据,...

    2021-2022计算机二级等级考试试题及答案No.9604.docx

    - **解析**:在 Java 中,使用 “==” 比较字符串时,实际上比较的是两个对象的引用是否相同,而不是字符串的值。要比较字符串的值,应该使用 `.equals()` 方法。 #### 28. 查询准则 - **题目描述**:使用文本值...

    计算机组成原理答案(唐朔飞)

    模拟计算机使用电压来表示数据,并通过电压组合和测量值来进行计算。其控制方式主要依赖于面板上的连线。 - **数字计算机**则是基于离散的0和1来表示数据,并采用位运算的方式进行计算。它具有更高的精确度、更大的...

Global site tag (gtag.js) - Google Analytics