JAVA 精确计算时的陷阱
troy
在java.math包中有个BigDecimal类,通过这个类可以进行精确计算. 我们知道BigDecimal有个setScale(int 精度,int 舍入模式)方法,随之而来问题出现了,当运行如下代码时:
/**
* @author troy(J2EE)
* @version 1.0
*/
import java.math.*;
public class Test{
public static void main(String[] args){
//精度为2,四舍五入模式
BigDecimal a =new BigDecimal(0.825).setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println(a);
}
}
却惊奇地打印出结果:
0.82
Oh My God,对0.825进行小数点后保留2位有效数字,四舍五入后结果应该是:0.83。为什么打印结果是0.82?
没错BigDecimal(double val)这个构造器欺骗了我们,它使用了0.825的近似值(0.8249999999999……)来构造BigDecimal。
为什么会这样?
原来JAVA存储浮点数(float、double)时,使用的是IEEE754标准,每个浮点数使用的是 符号位、阶码、尾数来表示:
````````符号位 阶码 尾数 长度
float 1 8 23 32
double 1 11 52 64
通过这种方法保存在计算机里面的浮点数,实际上是它的近似值。举例说明问题:
定义一个double 38414.4,将它转换为16进制。我们先计算整数部分38414等于960E。小数处理:0.4=0*0.5+0.25*1+0.0625*0+……,实际上我们永远计算不完。
结论:当我们定义一个浮点数时,请告诉自己,我们定义只不过是这个浮点数的近似值,即0.825!=0.825。
为了避免这个问题,我们应该使用如下方法:
/**
* @author troy(J2EE)
* @version 1.0
*/
import java.math.*;
public class Test{
public static void main(String[] args){
BigDecimal a =new BigDecimal("0.825").setScale(2, BigDe
相关文档:
JAVA文件操作总结
File类
File f = new File(path);
path为实际路径,该路径可以是文件,或文件夹,也可以是不存在的。
f.exists() 可以判断该路是否存在。
f.isDirectory() 可以判断是否是文件夹。
f.mkdirs(); 递归创建文件夹
File和输入输出流之间纽带FileInutStream,FileOutputStream
URL url = new URL(strUr ......
php和java通用sql语句法
SELECT max(id) from table
该方法在多线程等情况下可能会造成不正确。
java三种方法
1、根据ps的getGeneratedKeys
PreparedStatement ps = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS); //红色是关键
ps.executeUpdate(); //执行后
ResultSet rs = ps.getGeneratedKeys ......
System.out.println(2.00 -1.10);//0.8999999999999999
上面的计算出的结果不是0.9,而是一连串的小数。问题在于1.1 这个数字不能被精确表示
为一个double,因此它被表示为最接近它的double 值,该程序从2 中减去的就是这个值,
但这个计算的结果并不是最接近0.9 的double值。
一般地说,问题在于并不是所有的小数都可� ......
Graphics2D arg;
float thick=3.0f;
arg1.setStroke(new BasicStroke(thick, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_ROUND));
arg1.drawLine(first.x, first.y, next.x, next.y);
arg1.setColor(Color.red);
......
单态定义:
Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
Singleton模式就为我们提供了这样实现的可能。使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收(garbage c ......