JAVA的double类型的浮点运算(要解释的)。

解释一下为什么d!=d1;JSP脚本里应该怎么写。代码如下:double f=0.0005;
double i=3;
double d=f*i;
double f1=0.0003;
double j=5;
double d1=f1*j;
System.out.println(d+";;;;;;;;;;;"+d1);

double f=0.0005;
double i=3;
double d=f*i;
double f1=0.0005;
double j=3;
double d1=f1*j;
if(d==d1){
System.out.println("aaa");
}这样就相当,java中基本数据类型称为自动变量,自动变量存的是字面值,由于字面值的数据大小可知,生存期可知,出于速度的原因就把它们放在栈中,栈中的数据可以共享.如int a=3 int b=3 编译器先处理int a=3;首先它会在栈中创建一个变量为a的引用,然后在找字面值等于3的地址,没有 就开辟一个存放3这个字面值的地址,接着处理int b=3;在创建完变量为b的应用后,查找有没有3这个字面值的地址,现在有了,则指向3的地址,这时用==(判断地址是否相同时)就会为True
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-10-20
不光是在java中,在C中也是这样的.浮点数不能用=或是!=来比较,这和操作系统还有硬件有关系.这些差别会影响到浮点数的精度.(计算机内部都是使用2进制进行计算的)如果你非要比较两个浮点数的话,那么你可以覆写equals方法来比较一个近似的值.(C中也是如此)jsp也是一样的.脚本如下<%double f=0.0005;
double i=3;
double d=f*i;
double f1=0.0003;
double j=5;
double d1=f1*j;
%><%=d+";;;;;;;;;;;"+d1%>
第2个回答  2013-10-20
原因不知道,可能涉及一些低层的知识。只能提供解决方案,用java.math.BigDecimal。BigDecimal 类提供各种算术、标度操作、舍入、比较、哈希算法和格式转换的方法。BigDecimal f = new BigDecimal("0.0005");
BigDecimal i = new BigDecimal("3");
BigDecimal f1 = new BigDecimal("0.0003");
BigDecimal j = new BigDecimal("5");
System.out.println(f.multiply(i) + "\n" + f1.multiply(j));.
第3个回答  2013-10-20
要点: float:32位 double 64 位 long double 96 或者128位 标准认为: float 至少为6位有效数字。 double 至少为10位有效数字。 long double 至少10位有效数字。要点: 1.double 类型比float类型的计算要快。 2.对于浮点型,没有严格意义上的相等,因此比较是否相等,请用if(fabs(a-b)<0.00001); 2的10次方是1K,20次是1M,30次是1T 因此2的16次方是64000,2的17次方是128000;因此我认为应该至少用7位来表示小数点后面的数字。 #include <cstdlib> #include <iostream> using namespace std; int main(int argc, char *argv[]) { float a=0.111 111 911111111111111
第4个回答  2013-10-20
原因就是double 的0.0005他不是真正的0.0005.只是在它附近而已0.0003也是。。。。所以除以double 的0.0不会有错。因为0.0并不是0.0,而是在它附近 所以0.0005*3和0.0003*5肯定不一样。。但是结果很久接近。而不是相等
相似回答