日期:2014-05-20  浏览次数:20707 次

计算浮点数4.78的整数部分和小数部分
Java code

float f = 4.78f;
System.out.println((int)f);
System.out.println(f - (int)f);


结果输出
4
0.7800002
不应该是
4
0.78吗

------解决方案--------------------
浮点数的精度问题
------解决方案--------------------
float和double型由于二进制计数的根本原因,计算结果会出现误差,所以一般计算的时候使用
System.out.println(((float)Math.round( (f-(int)f) *100)/100));
------解决方案--------------------
float、double类型自身的精度问题!
------解决方案--------------------
再多说一点,在计算机中浮点的十进制的二进制数可能不够准确,例如2.4的二进制数表示的并非精确的2.4,可能是更接近二进制表示2.39999999(这个是举例不一定准确),所以通过计算出来的更不准确了。
------解决方案--------------------
浮点运算都会出现你这样的问题的。
不过好在Java提供了一种机制可以避免出现这种情况,用BegDecimal
------解决方案--------------------
Java code

BigDecimal f = new BigDecimal(7.48);
        BigDecimal i = new BigDecimal(7);
        f = f.subtract(i);
        System.out.println(f.floatValue());

------解决方案--------------------
探讨

Java code

BigDecimal f = new BigDecimal(7.48);
BigDecimal i = new BigDecimal(7);
f = f.subtract(i);
System.out.println(f.floatValue());

------解决方案--------------------
round
public static long round(double a)返回最接近参数的 long。结果将舍入为整数:加上 1/2,对结果调用 floor 并将所得结果强制转换为 long 类型。换句话说,结果等于以下表达式的值: 

(long)Math.floor(a + 0.5d)特殊情况如下: 

如果参数为 NaN,那么结果为 0。 
如果结果为负无穷大或任何小于等于 Long.MIN_VALUE 的值,那么结果等于 Long.MIN_VALUE 的值。 
如果参数为正无穷大或任何大于等于 Long.MAX_VALUE 的值,那么结果等于 Long.MAX_VALUE 的值。

参数:
a - 舍入为 long 的浮点值。 
返回:
舍入为最接近的 long 值的参数值。

------解决方案--------------------
单精度浮点型默认就是这么多小数位
------解决方案--------------------
浮点数精度问题,float和double都不精确,用BigDecimal,一般的涉及到精确地数字比如银行中存款什么的都不能用float等