在商业计算中(尤其是计算价格)需要使用BigDecimal类来进行精确小数计算,因为用其他类型计算(如double)得到的结果不是精确的! 写个测试类. import org.junit.Test; import java.math.BigDecimal; public class BigDecimalTest { @Test public void test1(){ System.out.println(0.05 + 0.01); // 0.060000000000000005 System.…
BigDecimal类用于高精度计算.一般的float型和Double型数据只可以用来做科学计算或者是工程计算,由于在商业计算中,要求的数字精度比较高,所以要用到java.math.BigDecimal类,它支持任何精度的定点数,可以用它来精确计算货币值. 有几点值得注意一下, 1.BigDecimal所创建的是对象,我们不能使用传统的+.-.*./等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法. 2.方法中的参数也必须是BigDecimal的对象.     如:two.add(…
Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高精度计算. 其中 BigInteger 类是针对大整数的处理类,而 BigDecimal 类则是针对大小数的处理类. BigDecimal 类的实现用到了 BigInteger类,不同的是 BigDecimal 加入了小数的概念. float和Double只能用来做科学计算或者是工程计算;在商业计算中,对数字精度要求较高,必须使用 BigIn…
java基础-BigDecimal类常用方法介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.BigDecimal类概述 我们知道浮点数的计算结果是未知的.原因是计算机二进制中,表示浮点数不精确造成的.这个时候你需要一个超级大型的浮点数据,并且提供高精度的浮点运算,也就是我们要说的BigDecimal. 不可变的.任意精度的有符号十进制数.BigDecimal 由任意精度的整数非标度值 和 32 位的整数标度 (scale) 组成.如果为零或正数,则标度是小数点后的位数…
java用double和float进行小数计算精度不准确 大多数情况下,使用double和float计算的结果是准确的,但是在一些精度要求很高的系统中或者已知的小数计算得到的结果会不准确,这种问题是非常严重的. <Effective Java>中提到一个原则,那就是float和double只能用来作科学计算或者是工程计算,但在商业计算中我们要用java.math.BigDecimal,通过使用BigDecimal类可以解决上述问题,java的设计者给编程人员提供了一个很有用的类BigDecim…
java.math.BigInteger.multiply(BigInteger val) 返回一个BigInteger,其值是 (this * val).声明 以下是java.math.BigInteger.multiply()方法的声明 public BigInteger multiply(BigInteger val) 参数 val - 通过此BigInteger乘以的值 返回值 该方法返回一个BigInteger对象的值是 this * val.异常 NA 例子 下面的例子显示math.…
来考虑这样一种情况,先来看代码: public class Test { public static void main(String[] args) { System.out.println(0.4 + 0.8); // = 1.2 ? System.out.println(2 - 1.1); // = 0.9 ? System.out.println(0.2 * 3); // = 0.6 ? System.out.println(1.2 / 3); // = 0.4 ? } } 也许你会天真…
http://blog.csdn.net/yuhua3272004/article/details/3075436 使用java.math.BigDecimal工具类实现   java保留两位小数问题: 方式一(四舍五入形式保留两位小数,注意模式ROUND_HALF_UP): 四舍五入   double   f   =   111231.5585;   BigDecimal   b   =   new   BigDecimal(f);   double   f1   =   b.setScale…
<Effective Java> 第48条:如果需要精确的答案,请避免使用float和double. 如果我们编译运行下面这个程序会看到什么?public class Test{    public static void main(String args[]){        System.out.println(0.05+0.01);        System.out.println(1.0-0.42);        System.out.println(4.015*100);    …
1.BigDecimal类概述  由于在运算的时候,float类型和double很容易丢失精度,演示案例.所以,为了能精确的表示.计算浮点数,Java提供了BigDecimal 不可变的.任意精度的有符号十进制数. 2.构造方法 public BigDecimal(String val):建议使用参数为字符串的构造方法,如果参数为double或float,还是会出现不可预知的精度问题 3.BigDecimal类成员方法 public BigDecimal add(BigDecimal augen…
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的数进行运算和处理.一般情况下,对于那些不需要准确计算精度的数字,我们可以直接使用Float和Double处理,但是Double.valueOf(String) 和Float.valueOf(String)会丢失精度.所以开发中,如果我们需要精确计算的结果,则必须使用BigDecimal类来操作啦!…
位置:java.math.BigDecimal 作用:提供高精度小数数据类型及相关操作 一.基本介绍 BigDecimal为不可变的.任意精度的有符号十进制数,其值为(unscaledValue * 10-scale)其中,unscaledValue(非标度值)为任意精度的整数.scale(标度)为32位整型(可为负) 提供以下操作:算术.标度操作.舍入.比较.哈希算法和格式转换. 用户能通过提供MathContext对象完全控制BigDecimal的舍入行为(也可使用类内提供的8种舍入模式).…
由于在运算的时候,float类型和double很容易丢失精度,演示案例,所以,为了能精确地表示.计算浮点数,Java提供了BIgDecimal BigDecimal类的概述 不可变的.任意精度的有符号十进制数.构造方法public BigDecimal(String val) 看程序写结果:结果和我们想的有点不一样,这是因为float类型的数据储存和整数不一样导致的.他们大部分的时候,都是带有有效数字位. 演示案例: System.out.println(0.09+0.01);//0.09999…
1.简介 BigDecimal类位于java.math.BigDecimal包下.使用此类可以完成大的小数操作,而且也可以使用此类进行精确的四舍五入,这一点在开发中经常使用. 对于不需要任何准确计算精度的程序可以直接使用float或double完成,但是如果需要精确计算结果,则必须使用BigDecimal类. 2.BigDecimal类常用方法 2.1.BigDecimal(String val):构造方法,将String类型转换成BigDecimal类型数据. 2.2.BigDecimal(d…
BigDecimal类 float.double类型的数字在计算的时候,容易发生精度丢失. 使用java.math.BigDecimal类可以解决此类问题. 前面讲过Math类,现在的BigDecimal类所在的包是math包. 注意Math类不在math包中,而是在lang包中. 形如:BigDecimal f3 = new BigDecimal(0.05); 创建BigDecimal类型也有进度偏差,一般-- 使用字符串形式构建,或者使用valueOf()方法得到! 使用字符串形式构建,或者…
笔记: Math类 * java.lang.Math提供了一系列静态方法用于科学计算:其方法的参数和返回值类型一般为double型. * abs 绝对值 * acos,asin,atan,cos,sin,tan 三角函数 * sqrt 平方根 * pow(double a,doble b) a的b次幂 * log 自然对数 * exp e为底指数 * max(double a,double b) * min(double a,double b) * random() 返回0.0到1.0的随机数…
1.引言 在java语言中,double和float用于二进制浮点型计算,无法得到精确的结果.而BigDecimal则用于精确的计算.不超过16位有效数字(最好是不超过13位)的科学和工程计算,可以使用double和float,但要求精确计或者超过了16位有效数字(超过13位也建议如此)的商业运算则需要使用BigDecimal进行运行,比如金融行业. <Effactive Java>第2版第48条中提到,“float和double类型尤其不适合用于货币计算,因为要让一个float或者doubl…
一.BigDecimal概述 ​ Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的数进行运算和处理.一般情况下,对于那些不需要准确计算精度的数字,我们可以直接使用Float和Double处理,但是Double.valueOf(String) 和Float.valueOf(String)会丢失精度.所以开发中,如果我们需要精确计算的结果,则必须使用…
一.字符串类String String:字符串,使用一对""引起来表示,字符串常量池在方法区中 public final class String implements java.io.Serializable, Comparable<String>, CharSequence { // } String声明为final的,不可被继承,代表不可变的字符序列 String实现了Serializable接口:表示字符串是支持序列化的. String内部定义了final char…
java四舍五入BigDecimal保留两位小数的实现方法: // 四舍五入保留两位小数System.out.println("四舍五入取整:(3.856)="      + new BigDecimal(i).setScale(2, BigDecimal.ROUND_HALF_UP)); JavaScript 保留两位小数的实现方法:四舍五入 var num =2.446242342; num = num.toFixed(2); // 输出结果为 2.45…
随笔:随着最近工作需要,回首需要涉及到一些精确的数据计算,就需要用到Bigdecimal,索性就趁着闲暇之余整理收集一下关于Bigdecimal的使用方法,由于时间的原因,整理的并不是特别详细,但相信一般用到的也应该的都整理到了,若是有疏漏之处,请小伙伴们提出,感谢大家的支持. 一.简介 Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数.在实际应用中,需要对更大或者更小的数进行运算和处理…
(转)Java浮点数float,bigdecimal和double精确计算的精度误差问题总结 1.float整数计算误差 案例:会员积分字段采用float类型,导致计算会员积分时,7位整数的数据计算结果出现误差. 原因:超出float精度范围,无法精确计算. float和double的精度是由尾数的位数来决定的.浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响. float:2^23 = 8388608,一共七位,这意味着最多能有7位…
一. 计算机的小数计算一定范围内精确,超过范围只能取近似值: 计算机存储的浮点数受存储bit位数影响,只能保证一定范围内精准,超过bit范围的只能取近似值. java中各类型的精度范围参见:http://blog.csdn.net/longshenlmj/article/details/47616481 编程时注意: doulbe类型的数,不能用等号判定是否相等(或者是一定范围内可以).因为两次同样的计算(除法)结果可能出现小数部分不同.甚至极端的时候,初始化两个小数时,都可能不相等(用数值和字…
最近有人在微信上给我发了一个数学题目,如下图: 我看了之后感觉很是简单,但是却想了半天才解出来.解出来后我想到了用程序再解一遍,然而精确计算的问题却让人头疼不已. 解题思路: 思路其实很简单,暴力求解就可以,但是当你写了一个四重for循环后你会发现解不出来.由此考虑到结果可能是小数,便把增量改成了float类型,每次自增0.1. 当你写完满心欢喜地运行的时候会发现还是出不来结果.再改成double类型也同样是不行. 这是因为java中float类型相加是把十进制转化为二进制后相加然后把二进制结果…
由于工作需要,写了一个使用BigDecimal运算的精确计算的计算器(然后发现其实比不用BigDecimal的并好不到哪里去) 只能做加减乘除 double类型的数字在千万级别的时候会转成科学计数法,我这个不会(我估计能有方法不以科学计数法显示) 其中用到的知识就是中缀表达式转后缀表达式,我是从这里学的: http://www.cnblogs.com/mygmh/archive/2012/10/06/2713362.html 下面上代码吧: 这个方法需要一个参数,String类型公式,形如:"1…
1. BigDecimal类概述: 由于在运算的时候,float类型和double很容易丢失精度.所以为了能够精确的表达.计算浮点数,Java提供了BigDecimal. BigDecimal:不可变.任意精度的有符号十进制数. 2. BigDecimal构造方法 public BigDecimal(String val) 3. BigDecimal的使用(加减乘除) public BigDecimal add(BigDecimal augend):加 public BigDecimal sub…
Math类:数学工具类,做一些数学计算,开方,对数,三角函数等 所有方法都是静态方法,不需要建立对象,直接用类名调用即可 示例: 这里写几个在日常开发中会用到的,比如三角函数之类的平时不会用到,了解即可 package demo; public class MathDemo { public static void main(String[] args) { function1(); function2(); function3(); function4(); function5(); } pu…
简介 如果基本的整数和浮点数精度不能够满足需求,那么可以使用 java.math 包下两个很有用的类:BigInteger 和 BigDecimal.这两个类可以处理包含任意长度数字序列的数值,BigInteger 实现了任意精度的整数运算,BigDecimal 实现了任意精度的浮点数运算.BigDecimal 由于舍入模式的存在,使得这个类用起来比 BigInteger 要复杂. BigInteger Java中long型为最大整数类型,对于超过long型的数据如何去表示呢.在Java的世界中…
BigInteger类 发 package cn.itcast_01; import java.math.BigInteger; /* * BigInteger:可以让超过Integer范围内的数据进行运算 * * 构造方法: * BigInteger(String val) */ public class BigIntegerDemo { public static void main(String[] args) { // 这几个测试,是为了简单超过int范围内,Integer就不能再表示,…
问题 java使用何种类型表示精确的小数? 结论 float和double类型的主要设计目标是为了科学计算和工程计算,速度快,存在精度丢失 BigDecimal用来表示任意精确浮点数运算的类,在商业应用环境下,不存在精度丢失 cookie 接受double实例化BigDecimal存在精度丢失问题,如果一定需要使用double,则先Double.toString()转成String后再行实例化: 建议接受String去实例化BigDecimal NOTE BigDecimal --> Long…