Java提供了两个用于高精度计算的类:BigInteger和BigDecimal
BigInteger:
BigInteger:支持任意精度的整数。
BigInteger(String val)
将 BigInteger 的十进制字符串表示形式转换为 BigInteger。
BigInteger(String val, int radix)
将指定基数的 BigInteger 的字符串表示形式转换为 BigInteger。
例如:
BigInteger bigInt = new BigInteger("11",2);
System.out.println("the big number is: " + bigInt);
结果显示:
the big number is: 3
BigDecimal:
BigDecimal:支持任何精度的定点数。
网上摘录技巧集:
1、当你在数据库里插入一条数据是6.00时,在显示时却是6.000000000000000000000。
解决方法:使用BigDecimal要用String来够造,要做一个加法运算,需要先将两个浮点数转为String(
如果利用double作为参数的构造函数,无法精确构造一个BigDecimal对象),然后构造成BigDecimal,在其中一个上调用add方法,传入另一个作为参数,然后把运算的结果(BigDecimal)再转换为浮点数。
即:
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){
//将传入的double转换为String
//如果利用double作为参数的构造函数,无法精确构造一个BigDecimal对象
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
//再将运算结果转换为double
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();
}
};
2、因此,使用这个类BigDecimal,需要注意
在构造方法中如果传入double,那么
不能保证他的精确程度。
如:
BigDecimal bigDec = new BigDecimal(6.217);
BigDecimal bigDecAdd = new BigDecimal(6.3229); BigDecimal bigDecResult = bigDec.add(bigDecAdd); System.out.println("the big decimal is: " + bigDecResult);
结果却是:
the big decimal is: 12.53989999999999938040673441719263792037963867187500
但
如果传入的是String类型,则:
the big decimal is: 12.5399
分享到:
相关推荐
### Thinking in Java 读书笔记知识点总结 #### 一、万事万物皆对象 1. **对象存储位置** - **寄存器**:程序无法直接控制。 - **栈(Stack)**:存储基本类型数据和对象引用,但对象本身不在此处。 - **堆(Heap)...
### Thinking in Java 自学笔记——第二章 一切皆对象 #### 重要概念解析 ##### 2.1 用引用操纵对象 在Java中,一切都被视为对象,这意味着无论是字符串、数字还是其他数据类型都可以被视为对象来进行操作。当...
《Thinking in Java》是一本深度解析Java编程语言的经典著作,其深入浅出的讲解和丰富的实例使得读者能够全面理解Java的精髓。以下是对书中部分关键知识点的总结: 1. **Java 泛型**:泛型是Java SE 5.0引入的重要...
Thinking in Java 自学笔记——第一章 对象导论 本章节总结了面向对象程序设计(Object-oriented Programming, OOP)的基本概念和原则,以帮助读者更好地理解 Java 编程语言。以下是对标题、描述、标签和部分内容的...
《王者归来之Thinking in Java读书笔记》是对Bruce Eckel的经典之作《Thinking in Java》第四版的深度学习与总结。这本书是Java程序员的必备参考书,它深入浅出地阐述了Java语言的核心概念和技术,旨在帮助读者理解...
### Thinking in Java 读书笔记知识点总结 #### 一、构造器与方法重载 1. **构造器的特点**: - 构造器不返回任何值,与返回`void`不同。 - 当未在类中声明构造器时,编译器会自动生成一个默认的无参构造器。 - ...
《Thinking in Java》是Bruce ...以上只是《Thinking in Java》第五部分可能涵盖的部分内容,实际笔记可能还涉及其他高级主题,如反射、注解、并发编程等。通过深入学习这些知识,可以全面提升对Java的理解和应用能力。
读书笔记:Thinking in Java (Java 编程思想)
### Thinking In Java 学习笔记知识点总结 #### 面向对象编程(OOP)的重要性及其影响 面向对象编程(OOP)在软件开发领域产生了深远的影响。它不仅提高了开发效率和降低了维护成本,还简化了设计流程,使得编程任务...
### Thinking In Java的第一章知识点概览 #### 一、面向对象的基本概念 在《Thinking In Java》这本书的第一章中,作者介绍了Java的核心理念——一切皆对象。Java采用了一种统一的语法来处理所有事物,这是因为Java...
《Thinking in Java》是Bruce Eckel的经典之作,这本书深入探讨了Java编程的各个方面。以下是根据提供的部分内容提炼出的一些核心知识点: 1. **访问修饰符**: - `public`:公共访问修饰符,允许所有类访问。 - ...
Java 编程基础 - 继承和复用 在 Java 编程中,继承和复用是两个非常重要的概念。继承允许我们创建出新的类,继承自已有的类,从而实现代码的重用和扩展。今天,我们将讨论继承和复用相关的知识点,并通过实践例子来...
《中文版Thinking in Java 4th编程思想》是学习Java编程的重要参考资料,它深入浅出地介绍了面向对象编程的核心概念。下面将详细解读其中的主要知识点。 1. **对象导论** - **万物皆对象**:Java编程的核心是对象...
JAVA学习日记---Thinking in Java学习笔记 第5章总结 第五章 初始化与清理 5.1 用构造器确保初始化 1.构造器命名必须与类名相同 2.构造器也是方法,满足方法的各种特征,无参数的构造器称为默认构造器,默认构造...
总之,《Thinking in Java》的读书笔记结合了广泛的Java知识和实践应用,从基础知识到高级主题,从理论到实践,为学习和提升Java编程技能提供了全面的资源。无论是对初学者还是经验丰富的开发者,这都是一个宝贵的...
这是我从一位认识的大神那里要来的第一手资料,主要是他对Java面向对象的一些认识,我看了之后顿时犹如醍醐灌顶,对面向对象的思想有了深刻认识!原来以前只是学了皮毛而已。遗憾的是,这个笔记他没有写完,我只是看...
"Java笔记"可能是个人或集体在学习Java过程中的整理,通常包含了学习心得、关键概念的总结和实例代码。这样的笔记往往更具实战性和针对性,可以帮助学习者巩固所学,快速查找遗忘的知识点,或者作为解决问题的参考。...
"Thinking in Java"是一本由Bruce Eckel编写的经典书籍,它深入浅出地介绍了Java编程语言,是许多初学者和专业开发者的必备读物。这个压缩包文件“java-resources-master”很可能包含了与学习和实践Java相关的各种...