日期:2014-05-20  浏览次数:20692 次

double类型的计算
一般的思维,1.003*1000=1003,
.....
int   ofset   =   1000;
double   dblvalue   =   ((Number)object).doubleValue()   *   ofset;
............

这样计算下来,我的dblvalue   的值是1002.9999999999...
因为在下面的计算我是format后,取到的是1002.
所以,想请教各位大虾们,应该通过什么样的计算,我的dblvalue值是1003,当然类型还是需要double的?

------解决方案--------------------
package number;

import java.math.BigDecimal;

public class DoubleTest {

/**
* @param args
*/
public static void main(String[] args) {
double i =1.003;
double j = 1000;
BigDecimal result = new BigDecimal(i).multiply(new BigDecimal(j));
System.out.println(result.setScale(0,0));
}

}


java中无法表示10的负幂,所以需要BigDecimal包装一下指定精度,楼主可以看看
< <Java解惑> > 这本书
------解决方案--------------------
可能没办法的吧
1.002*1000=1002.000000000xxx,不精确的,看到的跟实际内存中保存的是不一样的,
1.002*1000,如果确定是整数,则自己取整,如果是1.0021*1000=1002.100000000xxx,按楼主的需求可能是要1002.1
如果是1.00211*1000按楼主的需求可能是1002.11,这些都是人的计算,而不是计算机的计算,所以应该做不到的吧
------解决方案--------------------
BigDecimal的构造函数,其中一个构造函数以双精度浮点数作为输入,另一个以整数和换算因子作为输入,还有一个以小数的 String表示作为输入。
BigDecimal(double)构造函数,会在计算过程中产生舍入误差,最好用整数或String的构造函数。