2016冬天学习记录-1.15
来源:互联网 发布:淘宝不能选择菜鸟驿站 编辑:程序博客网 时间:2024/04/29 15:59
---------代码二、浮点型数字的处理
在计算(2-1.1)这样一个式子的时候,会发现,用System.out.println(2-1.1);计算出来的结果并不是0.9,而是0.89999999999,这是因为计算机在计算浮点型数字的时候需要首先将数据转化为二进制,但这种转化往往使计算结果失去精确性,所以我试着换一下思路,
开始我尝试这用printf控制输出格式:System.out.jprintf("%.2f",2-1.1);输出的结果是0.90,但实际上这种方法其实质并未发生改变。
然后我试着用下面这种办法规避浮点数计算的出现:
System.out.println((200-110)*1.0/100);这样子结果是正确的,但是如果我事先并不知道我要计算的数a和b,那么在用
System.out.println((a*100-b*100)*1.0/100);并且前面用a和b作为变量输入的时候,就又失去精确度。
只好求助《java解惑》给出一种类似于c++的运算符重载的办法(我第一感觉上是这样的,但实际并非如此)。即java.math.BigDecimal类来进行精确计算。
参考网址:
http://www.cnblogs.com/chenssy/archive/2012/09/09/2677279.html
http://blog.csdn.net/augus3344/article/details/51547356
(上面这两个从各个方面介绍了BigDecimal)
http://blog.csdn.net/alanzyy/article/details/8465098
(这个博客详细讲解运用BigDecimal计算除法是用到的RoungingMode参数)
http://www.yiibai.com/java/math/bigdecimal_negate.html
(讲解取反方法Java.math.BigDecimal.negate()方法实例)
大体总结如下:
-------------1、用float或者double变量构建BigDecimal对象。
可以使用BigDecimal的构造方法或者静态方法的valueOf()方法把基本类型的变量构建成BigDecimal对象
-------------2、通过调用BigDecimal的加,减,乘,除等相应的方法进行算术运算。(我们可以在运算的时候加精度,也可以在实例化BigDecimal的时候用字符串,都可以解决二进制转化导致的失准问题)
精度法形如:
BigDecimal abig=new BigDecimal(10.0);
BigDecimal bbig=new BigDecimal(9.1);
System.out.println(abig.subtract(bbig).setScale(2, BigDecimal.ROUND_HALF_UP));
字符串法形如:BigDecimal abig=new BigDecimal("10.0");
-------------3、把BigDecimal对象转换成float,double,int等类型。
-------------4、补充一下,关于取反。
BigDecimal abig=new BigDecimal("10.0");
System.out.println(abig.negate());
这样就可以了。
下面使我试验过的计算步骤:
import java.math.*;
public class Demo{
public static void main(String []atgs){
char a[]={'2'};
char b[]={'1','.','1'};
System.out.println(new BigDecimal(a).//---------------方法一
subtract(new BigDecimal(b)));
System.out.println(new BigDecimal("2").//---------------方法二
subtract(new BigDecimal("1.1")));
BigDecimal abig=new BigDecimal("10.0");//---------------方法三
BigDecimal bbig=new BigDecimal("20.0");
System.out.println(abig.subtract(bbig));
BigDecimal cbig=new BigDecimal(a);//---------------方法四
BigDecimal dbig=new BigDecimal(b);
System.out.println(cbig.subtract(dbig));
}
}
上面都可以比较便捷的计算
在计算(2-1.1)这样一个式子的时候,会发现,用System.out.println(2-1.1);计算出来的结果并不是0.9,而是0.89999999999,这是因为计算机在计算浮点型数字的时候需要首先将数据转化为二进制,但这种转化往往使计算结果失去精确性,所以我试着换一下思路,
开始我尝试这用printf控制输出格式:System.out.jprintf("%.2f",2-1.1);输出的结果是0.90,但实际上这种方法其实质并未发生改变。
然后我试着用下面这种办法规避浮点数计算的出现:
System.out.println((200-110)*1.0/100);这样子结果是正确的,但是如果我事先并不知道我要计算的数a和b,那么在用
System.out.println((a*100-b*100)*1.0/100);并且前面用a和b作为变量输入的时候,就又失去精确度。
只好求助《java解惑》给出一种类似于c++的运算符重载的办法(我第一感觉上是这样的,但实际并非如此)。即java.math.BigDecimal类来进行精确计算。
参考网址:
http://www.cnblogs.com/chenssy/archive/2012/09/09/2677279.html
http://blog.csdn.net/augus3344/article/details/51547356
(上面这两个从各个方面介绍了BigDecimal)
http://blog.csdn.net/alanzyy/article/details/8465098
(这个博客详细讲解运用BigDecimal计算除法是用到的RoungingMode参数)
http://www.yiibai.com/java/math/bigdecimal_negate.html
(讲解取反方法Java.math.BigDecimal.negate()方法实例)
大体总结如下:
-------------1、用float或者double变量构建BigDecimal对象。
可以使用BigDecimal的构造方法或者静态方法的valueOf()方法把基本类型的变量构建成BigDecimal对象
-------------2、通过调用BigDecimal的加,减,乘,除等相应的方法进行算术运算。(我们可以在运算的时候加精度,也可以在实例化BigDecimal的时候用字符串,都可以解决二进制转化导致的失准问题)
精度法形如:
BigDecimal abig=new BigDecimal(10.0);
BigDecimal bbig=new BigDecimal(9.1);
System.out.println(abig.subtract(bbig).setScale(2, BigDecimal.ROUND_HALF_UP));
字符串法形如:BigDecimal abig=new BigDecimal("10.0");
-------------3、把BigDecimal对象转换成float,double,int等类型。
-------------4、补充一下,关于取反。
BigDecimal abig=new BigDecimal("10.0");
System.out.println(abig.negate());
这样就可以了。
下面使我试验过的计算步骤:
import java.math.*;
public class Demo{
public static void main(String []atgs){
char a[]={'2'};
char b[]={'1','.','1'};
System.out.println(new BigDecimal(a).//---------------方法一
subtract(new BigDecimal(b)));
System.out.println(new BigDecimal("2").//---------------方法二
subtract(new BigDecimal("1.1")));
BigDecimal abig=new BigDecimal("10.0");//---------------方法三
BigDecimal bbig=new BigDecimal("20.0");
System.out.println(abig.subtract(bbig));
BigDecimal cbig=new BigDecimal(a);//---------------方法四
BigDecimal dbig=new BigDecimal(b);
System.out.println(cbig.subtract(dbig));
}
}
上面都可以比较便捷的计算
0 0
- 2016冬天学习记录-1.15
- 2016冬天学习记录-1.14
- 2016冬天学习记录-2.09
- 2016冬天学习记录-2.10
- 冬天
- 冬天
- 冬天
- 冬天
- 冬天
- 冬天
- 冬天
- 冬天
- 冬天
- 冬天
- 冬天
- 2016学习进度记录
- 记录生活,记录学习----我的2016
- 主题冬天
- SLG手游Java服务器数据管理方案
- java提高篇(二五)-----HashTable
- java远程调用shell脚本
- 7.4回溯法
- OpenCV霍夫梯度找圆算法
- 2016冬天学习记录-1.15
- 马尔可夫过程
- CentOS 6.4下编译安装MySQL 5.6.14
- 【c++】实验说明“转换构造函数”是如何转换的
- MySQL 使用 innobackupex 备份连接服务器失败
- Deep Compression, Song Han, Caffe 实现
- Android中OKHttp框架的使用
- 如何安装IntelliJ IDEA
- 工作小记~~~使用LinearLayout实现仿ListView(解决嵌套ListView显示不全)