解释一下为什么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
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%>
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));.
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肯定不一样。。但是结果很久接近。而不是相等