有个程序public class Test {
public static void main(String[] args) {
double pi = 3.1415;
double r = 6.5;
double v = 2*pi*r;
System.out.println(v);
}
}当pi取值为3.1415的时候,结果为40.8395,但是当pi取值为3.14159的时候,结果变成了40.840669999999996,我想知道为什么结果的小数一下变成那么多位?谢谢大家了!
public static void main(String[] args) {
double pi = 3.1415;
double r = 6.5;
double v = 2*pi*r;
System.out.println(v);
}
}当pi取值为3.1415的时候,结果为40.8395,但是当pi取值为3.14159的时候,结果变成了40.840669999999996,我想知道为什么结果的小数一下变成那么多位?谢谢大家了!
解决时使用BigDecimal运算成功后在转回来,或者Math.round的四舍五入。
double 是 64位 8个byte 吧
自己猜想一下:首先计算机无法表示连续的数,所以表示的数只能是离散的。 感觉double就是用 64 bit 表示 0101010010 位串,可能是作运算时,要先把 3.1415之类的数转化为 010100 之类的位串,之后做乘法,交给CPU 的ALU了,之后的到的 010101010 位串,再转化成 10进制的小数。可能是3.1415的,和3.14159的 两种情况最后算出(运算中进位)的 位串从右向左 第一个 1 的位置比较靠前,所以转化的10进制 精度小些?导致最后精度不同。求高人指点~
以及http://zh.wikipedia.org/wiki/IEEE_754
public class jingdu{
public static void main(String[] args){
System.out.print(2.0-1.1);
}
}由于小数是0.1 在化二进制的时候是个循环的 即使用double也是无法精确表示的
0.1*2=0.2
0.2*2=0.4
0.4*2=0.8
0.8*2=1.6
0.6*2=1.2
0.2*2= 0.4
........