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/