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

[300分]求高手:关于double型的求模问题??急急急急急急急急急急急急急急急急急急急急急
public   class   FloatTest   {  

public   static   void   main(String[]   args)
{  
            double     d=18%1.8;  
    System.out.println(d);  
    d=15%1.5;  
    System.out.println(d);  
    d=24%2.0;  
    System.out.println(d);
    d=16%1.6;  
    System.out.println(d);
}  
}  
  在控制台上打印的结果是:
1.7999999999999996
0.0
0.0
1.5999999999999992
不知为何是这样如何解释没规律呀???????!
如果可以马上结帖!!!!!!!!!!!!
  


------解决方案--------------------
double类型本来就不是严格精确的,它只是在精度范围内正确。这样很正常。毕竟你是对小数去模啊。考虑人工来算还不是也是这样啊。
------解决方案--------------------
扩大十倍试试
------解决方案--------------------
精度问题.不知道怎么解释.
------解决方案--------------------
二进制不能精确表示1.6,1.8所致
------解决方案--------------------
Up
------解决方案--------------------
用BigDecimal就行了,关键是看你的要求是不是很高
------解决方案--------------------
路过问一下,这样求模有什么意义吗?
------解决方案--------------------
对小数求模有意义么?
尤其是在计算机无法精确表示小数的情况下
------解决方案--------------------
第一回听说,还有对double型求模的,有意义吗?
要求是取整后求吧?
------解决方案--------------------
试一下:
public static void main(String[] args)
{
BigDecimal b = new BigDecimal( "1.6 ");
BigDecimal c = new BigDecimal( "16 ");

c = c.remainder(b);

System.out.println(c);

}


------解决方案--------------------
不能精确表示1.6和1.8
------解决方案--------------------
这主要是机器内部数据和开发语言环境时的精度丢失问题,跟java没关系,c也一样

计算机里表示数都是用的IEEE754标准 是2进制数
c语言的double型在计算机内部表示应为 1位数符,11位阶码,52位位数,总共64位构成构成
是一个相当相当精确的数据(并不是完全精确).最大值应该是2的3970次方左右

当数据从机器传递到开发语言环境时,数据需要从一种格式转化为其它的格式。当进行数据转换时,有可能造成数据精度上的丢失。同样,数据从一种类型转换为另一种类型的过程也会影响程序的性能.

有时间你看看这个
http://tag.csdn.net/tag/ieee754/