本人是初学者,请大虾请看下面的程序
class StringTest
{
public static void main(String[] args)
{
int i=3;
float ff=15.123f;
System.out.println(i+ff);
//这句打印出来的结果是18.123001

如果将ff设为1.1f,print打印出来的是4.1
}
}为什么结果会是18.123001 ?还请大虾指教一下?

解决方案 »

  1.   

    这你应该去问 JVM 了
    这种问题在实际应用中不是特别重要的
      

  2.   

    浮点数有精度问题的。
    如果楼主好好学过微机原理,就会一点也不觉得奇怪了。
    没好好学过也不要紧,知道浮点数本来就不是准确的就OK了。如果你不信,你可以手工试着把15.123化成二进制,你就知道我说的对不对了。一个float连底数加指数才32个比特,却能表示10的38次方那么大的数。这是为什么?就是牺牲了精度换来了表示范围。
    另外,当把一个数打印成字符串时,可以控制它的显示位数的,方法是使用相应的Formatter类。
    还需要知道显示出来的字符串只是一个近似的显示结果,它并不准确对应内存里的那个float,内存里的float,如果不转化成近似的十进制字符串来显示,人眼看起来是很费劲的。
      

  3.   

    对呢?float型的数输出不是小数点后面六位吗?
    怎么1.1f的时候就输出小数点后面的一位呢?
    有点奇怪……
      

  4.   

    我猜是JAVA库在转换float到string时,如果发现末尾跟着的全是无效的0,就自动去掉了。
      

  5.   

    奇怪的事很多,反正就是Float的精度问题了。
      

  6.   

    楼主。这个问题在计算的时候JVM是把INT类型转化为FLOAT类型来计算的。
    当然在转化的过程中会产生精度的丢失。这个问题呢。其实不必弄的很清楚。
    JAVA语言不是C++或者C语言。这里精度的不准确一般不会影响你的应用。。
      

  7.   

    精度啊,大哥,现在内存都NG了,别再省那点内存了,直接DOUBLE吧