class Why {
public static void main(String[] args) {
float a=7.5f;
float b=2.3f;
float m;
m=a%b;
System.out.println(m);
}
}编译后运行,输出结果是0.60000014,怎么有8位小数啊?!float数据类型不是最多保留7位小数的吗?就是写作m=(float)(a%b),结果还是这个数,这是怎么回事儿呢?还有,为什么结果不是0.6或者0.6000000,而是0.60000014呢?这是怎么计算的啊??

解决方案 »

  1.   

    java解惑里边讲了很多这些东西
    可惜忘了
      

  2.   

    我用的编译器是jdk1.5.0.9,这官方的编译器啊。再说了,数据类型和编译器有这么大关系吗?还有,为什么不是0.6,而是后面还有小数位呢??
      

  3.   

    这些都不要觉得奇怪哦,因为浮点数(float类型数据)在计算机中真正的表示方式是按照IEEE标准存储的。
    学过计算机组成原理的应该都知道,它和整形数据在计算机中存储是完全不一样的。
    当然,要想得到0.6这样的结果的话,应该使用到java中的一个类叫做:BigDecimal,程序改成这样:class Why {
        public static void main(String[] args) {
            BigDecimal a = new BigDecimal(7.5);
            BigDecimal b = new BigDecimal(2.3);
            float m = a.mod(b).floatValue();
            System.out.println(m);
        }
    }
      

  4.   

    我运行的结果和楼主是一样的。
    楼主可以运行一下这段代码
    System.out.println (1.10 - 0.11);
    你可能以为结果是0.99,
    但实际上是0.9900000000000001,
    不要惊讶,java中的浮点型就是这样不靠谱,
    如果要精确计算请用java.math.BigDecimal,
    可惜BigDecimal没有取模运算,
    BigInteger可以,可惜是整数
      

  5.   


    我说兄弟啊,BigDecimal可没有取模,那是BigInteger,别误导了楼主
      

  6.   

    因为float类型默认小数点后保留8位
      

  7.   

    嗯,准确地说float是8位精度,这个我今天明白了。但是两个浮点数的运算该怎么处理才好啊?
      

  8.   

    不知道楼主对我这个感兴趣不?/**
    * 根据指定的小数位数返回浮点数字符串,末尾4舍5入
    * @param f float 浮点数
    * @param m 小数位数
    * @return String 结果字符串
    */
    public static String reservationsPonit(double f,int m){
     java.text.DecimalFormat format = (java.text.DecimalFormat)java.text.DecimalFormat.getInstance();
     String str="";
     for(int i=0;i<m;i++){
     str+="#";
     }
     format.applyPattern("####."+str);
     return format.format(f);
    }
      

  9.   

    java的浮点数运算确实不精确,我也不明白。第一次我也想到用BigDecimal,但BigDecimal没有取余的方法.所以,把浮点数转换为整数再运算,再把结果还原成浮点数.
    public static void main(String args[]){
        
        
         float a=7.5f;
        float b=2.3f;
        float m;
        
         int ai = (int)( a * 10 );
         int bi = (int)( b * 10 );
         int mi ;
         mi = ai % bi;
        
         m = (float)mi / 10 ;
         System.out.println(m);
        
        }
    想限定结果位数的话,像14楼的那样用DecimalFormat,然后format.applyPattern("##.##"),只所以需要强制转型,是因为DecimalFormat.getInstance()返回的是NumberFormat,NumberFormat是DecimalFormat的父类。那为什么不用NumberFormat呢,你看看这篇文章http://www.blogjava.net/tomato2088/archive/2006/12/14/87731.html