今天在复习一道Java题目的时候遇到了一个问题:计算机计算精度问题。
  具体题目如下:(15.2 % 0.5 == 0.2)在JAVA中的结果是TRUE还是FALSE.其实经过直接观察,发现结果的准确值很容易得出:0.2,但是在计算机的运算过程中要先把小数转换成二进制,在进行运算,所以最后的结果是1.99999....,所以本来应该是TRUE的问题,变成了FALSE。
  我想说的是,本来计算机是一种工具,帮助我们人类解决一些问题,可是现在,我们反倒要替它考虑考虑,计算计算,结果对不对,这个很让人蛋疼——我们成了计算机的工具,成了她的奴隶。我想问问这个问题究竟怎么计算才能得出0.2.谢谢

解决方案 »

  1.   

    嘿嘿:
    if (abs((15.2 % 0.5) - 0.2) < 0.00000001)或者 所有运算量×10,转整型,再计算。
    所以知道为啥显卡要求很强很强的计算能力了吧?全都是浮点运算。
      

  2.   

    浮点运算用 BigDecimal 试试。
      

  3.   

    BigDecimal是没有mod运算的,囧
    如果一样要浮点数取模,只能象一楼说的,取近视相等了。
      

  4.   

    BigDecimal有取模运算,reminder函数可以用,不过结果也是一样的所以还要进行四舍五入。
    import java.math.BigDecimal;public class Yunsuan {
    public static void main(String[] args) {
    float a = 15.2f ;
    float b = 0.5f ;
    BigDecimal b1 = new BigDecimal(a) ;
    BigDecimal b2 = new BigDecimal(b) ;
    b1.remainder(b2) ;
    System.out.println("15.2 % 0.5 = " + Yunsuan.round(b1.remainder(b2).floatValue(),1)) ;

    }
    public static float round(double d,int len){
    BigDecimal b1 = new BigDecimal(d) ;
    BigDecimal b2 = new BigDecimal(1) ;  //任何数除以1都是其本身
    return b1.divide(b2,len,BigDecimal.ROUND_HALF_UP).floatValue() ;
    }
    }
      

  5.   

    你可以自己写个方法,先转换成字符串,然后判断出小数点的位置,去掉小数点,字符串转int,两个参数小数点对位调整,整数计算,计算结果小数点处理,输出。
      

  6.   

    这是你使用的方式不对,float,double本来就不能精确表示一些小数你这儿用浮点数作为参数传进BigDecimal结果当然不会精确正确的使用方式如下:BigDecimal b1 = new BigDecimal("15.2") ;
    BigDecimal b2 = new BigDecimal("0.5") ;
    BigDecimal remainder = b1.remainder(b2) ;
    System.out.println(remainder);