import java.math.BigDecimal;public class TestDouble {
public static void main(String[] args) {
double d1 = div(20130708154752d,1000000000000d);
double d2 = 16000d;
System.out.println(d1);
System.out.println(sum(d1,d2));
}
public static double sum(double d1,double d2){
BigDecimal bd1 = new BigDecimal(Double.toString(d1));
BigDecimal bd2 = new BigDecimal(Double.toString(d2));
return bd1.add(bd2).doubleValue();
}
public static double div(double v1,double v2){
return div(v1,v2,12);
}
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();
}
}运行结果是:
20.130708154752
16020.130708154751如何能避免精度损失的问题?double 精度 运算
解决方案 »
- Class的getMethod方法无法获得Method对象!!
- 在一个程序里面 多次使用同一个单例模式的函数 会影响程序性能么 ?
- java 能否实现数据结构上的链表
- 学习java要领是什么?
- java 制作托盘 图标闪烁实现
- JAVA的小问题啊!
- 我用JAWIN实现JAVA与VC OCX,但是出现异常,想大家看看帮帮忙
- 【关于写文件的简单问题!】
- 请问,一般用java做什么?
- *****老大们请给我讲讲JPhone*****
- 连接数据库的一段程序 学姐学长谁能帮我解释一下 return (rs == null) || (rs.equals(""));
- java application 应用程序 e.printStackTrace()打印到哪里了
用double转其他类型的时候,已经存在误差了。
例如,财会做账,我们通常以分为单位,而不是元,这样避免浮点数的精度损失。
但是,如果做平均数、方差之类的运算 ,还是会产生精度损失,这时就只能控制精度。
BigDecimal 是高精度的浮点数,通过这个类封装过后,可以处理高精度的数字。计算机存储的是二进制数字,所以,保存十进制数据时,有时候也会产生误差。
所以,我们应该关注误差的大小,控制在我们能接收的范围就好。
还要注意误差传递的问题。