今天在复习一道Java题目的时候遇到了一个问题:计算机计算精度问题。
具体题目如下:(15.2 % 0.5 == 0.2)在JAVA中的结果是TRUE还是FALSE.其实经过直接观察,发现结果的准确值很容易得出:0.2,但是在计算机的运算过程中要先把小数转换成二进制,在进行运算,所以最后的结果是1.99999....,所以本来应该是TRUE的问题,变成了FALSE。
我想说的是,本来计算机是一种工具,帮助我们人类解决一些问题,可是现在,我们反倒要替它考虑考虑,计算计算,结果对不对,这个很让人蛋疼——我们成了计算机的工具,成了她的奴隶。我想问问这个问题究竟怎么计算才能得出0.2.谢谢
具体题目如下:(15.2 % 0.5 == 0.2)在JAVA中的结果是TRUE还是FALSE.其实经过直接观察,发现结果的准确值很容易得出:0.2,但是在计算机的运算过程中要先把小数转换成二进制,在进行运算,所以最后的结果是1.99999....,所以本来应该是TRUE的问题,变成了FALSE。
我想说的是,本来计算机是一种工具,帮助我们人类解决一些问题,可是现在,我们反倒要替它考虑考虑,计算计算,结果对不对,这个很让人蛋疼——我们成了计算机的工具,成了她的奴隶。我想问问这个问题究竟怎么计算才能得出0.2.谢谢
if (abs((15.2 % 0.5) - 0.2) < 0.00000001)或者 所有运算量×10,转整型,再计算。
所以知道为啥显卡要求很强很强的计算能力了吧?全都是浮点运算。
如果一样要浮点数取模,只能象一楼说的,取近视相等了。
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() ;
}
}
BigDecimal b2 = new BigDecimal("0.5") ;
BigDecimal remainder = b1.remainder(b2) ;
System.out.println(remainder);