- 浏览: 308709 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (187)
- JAVA (66)
- JS (2)
- AJAX (9)
- Servlet (5)
- eclipse (4)
- html (2)
- PL/SQL (9)
- SOAP (1)
- other (14)
- JavaScript (8)
- Struts2 (6)
- Spring (10)
- Hibernate (5)
- JSP (1)
- Linux (3)
- WebService (2)
- 数据结构 (1)
- DB (5)
- English (1)
- maven (4)
- Code standard (2)
- SQL (1)
- 软件架构 (1)
- Tomcat (2)
- windows (1)
- HSQL (0)
- Open source framework (0)
- Web (6)
- Compass (0)
- Flex (1)
- OSGI (1)
- python (3)
- groovy (2)
- JPA (2)
- svn (1)
- jetty (1)
最新评论
-
zjfshowtime:
it doesn't work !why
Tomcat 和 Jetty 下 JNDI 配置 DBCP 连接池 -
coco5012:
Useful
sql server日期时间函数 datetime -
烟花弥散:
弱弱的问一句,您的第一个举例中else 后面可以跟判断条件吗? ...
Java高手论道:你还在用if else吗? -
coco5012:
Not very simple
使用assembly plugin实现自定义打包 -
mqlfly2008:
[color=red][size=medium][size=x ...
Java高手论道:你还在用if else吗?
Java 提供了两个类专门用于进行高精度运算BigInteger 和 BigDecimal ,尽管它们可大致划分到与封装器相同的类别里,但两者都没有对应的主类型;这两个类都有自己的一系列方法,类似于我们针对主类型执行的操作,也就是说能用 int 或float 做的事情,用BigInteger和BigDecimal 一样可以做,只是必须换用方法调用,而不是使用运算符。此外由于牵涉更多,所以运算速度会慢一点总之我们牺牲了速度,但换来了精度。
高精度浮点数BigDecimal
一些非整数值(如几美元和几美分这样的小数)需要很精确。浮点数不是精确值,所以使用它们会导致舍入误差。因此,使用浮点数来试图表示象货币量这样的精确
数量不是一个好的想法。使用浮点数来进行美元和美分计算会得到灾难性的后果。浮点数最好用来表示象测量值这类数值,这类值从一开始就不怎么精确。
从
JDK 1.3 起,Java 开发人员就有了另一种数值表示法来表示非整数:BigDecimal。BigDecimal
是标准的类,在编译器中不需要特殊支持,它可以表示任意精度的小数,并对它们进行计算。在内部,可以用任意精度任何范围的值和一个换算因子来表示
BigDecimal,换算因子表示左移小数点多少位,从而得到所期望范围内的值。因此,用 BigDecimal 表示的数的形式为
unscaledValue*10-scale。
用于加、减、乘和除的方法给 BigDecimal 值提供了算术运算。由于
BigDecimal 对象是不可变的,这些方法中的每一个都会产生新的 BigDecimal
对象。因此,因为创建对象的开销,BigDecimal
不适合于大量的数学计算,但设计它的目的是用来精确地表示小数。如果您正在寻找一种能精确表示如货币量这样的数值,则 BigDecimal
可以很好地胜任该任务。
如浮点类型一样,BigDecimal 也有一些令人奇怪的行为。尤其在使用 equals()
方法来检测数值之间是否相等时要小心。equals() 方法认为,两个表示同一个数但换算值不同(例如,100.00 和 100.000)的
BigDecimal 值是不相等的。然而,compareTo() 方法会认为这两个数是相等的,所以在从数值上比较两个 BigDecimal
值时,应该使用 compareTo() 而不是 equals()。
另外还有一些情形,任意精度的小数运算仍不能表示精确结果。例如,1
除以 9 会产生无限循环的小数 .111111...。出于这个原因,在进行除法运算时,BigDecimal
可以让您显式地控制舍入。movePointLeft() 方法支持 10 的幂次方的精确除法。
对于
BigDecimal,有几个可用的构造函数。其中一个构造函数以双精度浮点数作为输入,另一个以整数和换算因子作为输入,还有一个以小数的
String 表示作为输入。要小心使用 BigDecimal(double)
构造函数,
因为如果不了解它,会在计算过程中产生舍入误差。请使用基于整数或 String 的构造函数。
如果使用 BigDecimal(double) 构造函数不恰当,在传递给 JDBC setBigDecimal() 方法时,会造成似乎很奇怪的 JDBC 驱动程序中的异常。例如,考虑以下 JDBC 代码,该代码希望将数字 0.01 存储到小数字段:
PreparedStatement ps =connection.prepareStatement("INSERT INTO Foo SET name=?, value=?");
ps.setString(1, "penny");
ps.setBigDecimal(2, new BigDecimal(0.01));
ps.executeUpdate();
在执行这段似乎无害的代码时会抛出一些令人迷惑不解的异常(这取决于具体的 JDBC 驱动程序),因为 0.01
的双精度近似值会导致大的换算值,这可能会使 JDBC 驱动程序或数据库感到迷惑。JDBC
驱动程序会产生异常,但可能不会说明代码实际上错在哪里,除非意识到二进制浮点数的局限性。相反,使用 BigDecimal("0.01") 或
BigDecimal(1, 2) 构造 BigDecimal 来避免这类问题,
因为这两种方法都可以精确地表示小数。
import java.math.BigDecimal; /** * * * <p>Title: 开源,开放</p> * * <p>Description: opeansource</p> * * <p>Copyright: Copyright (c) 2004</p> * * <p>Company: ?海棠</p> * * @author HaiTang Ming * * @version 1.0 */ public class BigDecimalUtil { //默认除法运算精度,及即保留小数点多少位 private static final int DEF_DIV_SCALE = 2; //这个类不能实例化 private BigDecimalUtil (){ } /** * * 提供精确的加法运算。 * * @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(); } /** * * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 * * 小数点以后多少位,以后的数字四舍五入。 * * @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(); } public static void main(String[] args){ System.out.println(add(234.44,534.90)); double a = 123.345678; double d = round(a,2); System.out.println("round("+a+",2)--->"+d); } }
高精度整数BigInteger
BigInteger支持任意精度的整数,也就是说我们可精确表示任意大小的整数值;同时在运算过程中不会丢失任何信息;
在BigInteger类中有所有的基本算术运算方法,如加、减、乘、除,以及可能会用到的位运算如或、异或、非、左移、右移等。下面是一些方法的例子:当然,如果要有更多的使用方法,可以查阅java api 。
public class BigIntegerTest { public BigIntegerTest() { } /** * * 测试BigInteger * */ public static void testBigInteger() { BigInteger bi = new BigInteger("888"); //multiply :乘法 BigInteger result = bi.multiply(new BigInteger("2")); System.out.println(result); //divide : 除法 result = bi.divide(new BigInteger("2")); System.out.println(result); //add : 加法 result = bi.add(new BigInteger("232")); System.out.println(result); //subtract :减法 result = bi.subtract(new BigInteger("23122")); System.out.println(result); result = bi.shiftRight(2); System.out.println(result); } public static void main(String[] args) { testBigInteger(); } }
本文来自于:http://dev.firnow.com/course/3_program/java/javaxl/2008914/142796_2.html
发表评论
-
JAVA ArrayList深层 拷贝 克隆
2012-04-23 14:13 2559大家应该理解浅拷贝和深拷贝的区别: 浅拷贝:被复制对象的任何 ... -
深入 Lucene 索引机制
2011-09-21 21:49 617简介: Lucene 是一个 ... -
Apache DBUtils使用总结
2011-09-19 10:50 982Apache DBUtils使用总结 DBU ... -
Java搜索引擎 Lucene
2011-09-19 10:43 883Lucene 是一套用于全文 ... -
Java的弱引用(Weak Reference)
2011-09-16 08:47 1326之前一直没有接触 ... -
JAVA读取大文件
2011-09-13 10:27 3400/** * */ package com.b2s. ... -
Java性能优化技巧
2011-09-06 11:59 891摘要: ==================== ... -
java程序性能优化
2011-09-06 11:58 695一、避免在循环条件中使用复杂表达式 在不做编译优化 ... -
大家在普遍认识中对架构师这一职业有哪些误区
2011-09-04 10:26 747误区一 架构师与项目经理没有区别。大家经常在 ... -
Ibatis执行SQL操作把SQL打印到控制台
2011-08-10 10:46 2773要想让Ibatis打印SQL语句到控制台,可以在log4j.x ... -
用 PMD 铲除 bug
2011-06-08 17:33 1033简介: PMD 是一个开源的静态分析工具,是一个值得您添加 ... -
Web Service 实现分布式服务的基本原理
2011-05-24 13:27 1498简单的说, 就是客户端 ... -
Web Service概述
2011-05-24 10:16 1008Web Service是构建互联网 ... -
有关母亲的名人名言
2011-05-09 08:42 812God could not be everywhere and ... -
装饰器模式[Decorator]
2011-05-06 17:42 732装饰器模式 主要应用于这样一种场合,当你已经 ... -
Java 7已经完成的七大新功能预览
2011-05-06 12:26 1145今年的Devoxx大会又是一次有关Java 7进程的一 ... -
回归测试
2011-05-04 17:16 797回归测试, 英文是Regression testing。 ... -
jxl 使用总结收藏
2011-04-29 17:33 965jxl的一些总结 要 ... -
Struts1下如何实现国际化
2011-04-25 14:18 1141Struts1下如何实现国际化 1.ApplicationR ... -
JAVA静态导入(import static)详解
2011-04-20 17:52 4025在Java 5中,import语句得到了增强,以便提供甚至更加 ...
相关推荐
3. **运算符重载**:`BigDecimal`提供了与`BigInteger`类似的算术操作,但还包括了除法、比较和舍入操作。它还支持`add()`, `subtract()`, `multiply()`, `divide()`, `divideToIntegralValue()`等方法。 4. **舍入...
BigInteger和BigDecimal
BigInteger、BigDecimal 和 BigRational 这些是多精度BigInteger 、 BigDecimal和BigRational类型的实现,从头开始构建。 大整数 BigInteger是一个多精度整数。 它的大小仅受可用内存的限制。 BigInteger是为易用性...
BigInteger (大整数类) 使用时导包:java.math.BigInteger 作用:可以使用BigInteger操作大整数,也可以转换进制。如果在操作的时候一个整型数据已经超过了整数的最大类型长度long的话,则此数据就无法装入,所以...
在Java编程语言中,`BigInteger`和`BigDecimal`是两个重要的类,用于处理大整数和高精度浮点数运算。这两个类属于`java.math`包,为开发者提供了超越普通`int`、`long`以及`float`和`double`类型的数值计算能力。 `...
与Java或.NET中的double类型不同,BigDecimal不涉及舍入误差,因此特别适合进行财务计算。 3. BigFloat:这是一个专门处理高精度浮点数的数据类型,类似于BigDecimal,但通常更适用于科学计算。它能够在保持精度的...
Ratio对象可以存储两个整数的比率,支持常见的数学运算,并且可以与BigInteger和BigDecimal对象进行转换,使得在处理各种类型的数字时具有更大的灵活性。 **ClojureScript兼容性** 除了JavaScript,红鳞库还支持...
* System 类、Math 类、BigInteger 与 BigDecimal 3. 枚举类与注解(364-371页) * 枚举类的使用 * 注解 (Annotation) 4. Java 集合(380-440页) * Java 集合框架概述 * Collection 接口方法 * Iterator 迭代器...
java biginteger源码用于 JavaScript 的 BigDecimal BigDecimal for Javascript是不可变、任意精度、有符号十进制数的纯 Javascript 实现。...BigDecimal 支持任意精度的十进制数学。...它与 Java 1.5 BigIntege
- **BigInteger与BigDecimal类**:用于处理大数值运算。 #### 七、Java容器类 - **集合框架**:Java集合框架主要包括List、Set、Map等接口及其具体实现类。 - **List**:有序集合,允许重复元素,主要实现有...
Java中BigInteger的数学运算,BigDecimal 加减乘除运算,Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大...
使用 `toBigInteger()` 方法将 BigDecimal 转换为 BigInteger,然后可以安全地调用 `intValueExact()` 方法,该方法会在值超出 Integer 范围时抛出异常。 4. **其他转换方法** 除了 `intValue()` 和 `...
然而,在某些情况下,我们可能需要将BigDecimal类型的值转换为Double类型,比如为了与一些只接受基本数据类型或其包装类的方法参数兼容,或者进行一些基于Double的数学运算等。本文将详细介绍如何在Java中实现...
java.math.BigDecimal 操作类,包含加减乘除、String型加减乘除精度格式化转换计算等
Java 中的 Math、BigInteger 和 BigDecimal 类 Java 语言中提供了多种数学类来帮助开发者进行数学运算,包括 Math、BigInteger 和 BigDecimal 类。这些类提供了丰富的数学方法,帮助开发者快速高效地进行数学运算。...
BigInteger支持的基本操作包括加法、减法、乘法、除法以及各种位操作,如位移、按位与、按位或、按位异或等。它还提供了比较操作,可以用来比较两个BigInteger对象的大小。 在设计分数类时,你需要考虑以下几点: ...
与BigInteger不同,BigDecimal的除法需要指定`RoundingMode`,以决定如何处理除不尽的情况。在例子中使用了`HALF_UP`,即四舍五入到最接近的数字。 除了大数字操作,Java还提供了一些工具库类,例如Arrays类,它是...
Java Bigdecimal使用原理详解 Java Bigdecimal是Java语言中用于精确计算的类,它可以完善float和double类无法进行精确计算的缺憾。BigDecimal类位于java.math类包下,提供了多种构造函数和方法来实现精确计算。 ...
1. **构造方法**:`BigDecimal`可以通过字符串、整数、长整数或`BigInteger`实例来创建。例如,`new BigDecimal("123.45")`或`new BigDecimal(12345)`。 2. **基本运算**:`BigDecimal`支持加法(`add()`), 减法(`...