浮点数运算的陷阱

    浮点数的运算不能说是精确的,因为某些数字不能准确表示为二进制(例如: 0.1),以下是一个用浮点数运算的例子,例子证明了我们应该慎用浮点数运算。

/**
 * @author crane.ding
 */
public class Test {

	public static void main(String[] args) {
		final float ff = 0.6f + 0.1f;
		final double fd = 0.6f + 0.1d;
		final double df = 0.6d + 0.1f;
		final double dd = 0.6d + 0.1d;
		
		System.out.println(ff + " : " +(ff == 0.7f));
		System.out.println(fd + " : " +(fd == 0.7d));
		System.out.println(df + " : " +(df == 0.7d));
		System.out.println(dd + " : " +(dd == 0.7d));

		System.out.println("\nfloat");
		for (float f = 0; f < 1; f = f + 0.1f)
			System.out.println(f);
		
		System.out.println("\ndouble");
		for (double d = 0; d < 1; d = d + 0.1)
			System.out.println(d);
	}

}

运行结果如下:
0.70000005 : false
0.7000000238418579 : false
0.7000000014901161 : false
0.7 : true

float
0.0
0.1
0.2
0.3
0.4
0.5
0.6
0.70000005
0.8000001
0.9000001

double
0.0
0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.7
0.7999999999999999
0.8999999999999999
0.9999999999999999

从以上的运行结果我们不难看出,浮点数的运算是有误差的,例如0.2加0.1就不等于0.3;对于金额的运行如果采用浮点数,那计算出来的金额就不一定是准确的;这也是许多程序开发人员经常接触,而未考虑到的一个小陷阱。

你可能感兴趣的:(F#)