首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

double 值的圈套

2012-10-15 
double 值的陷阱@Testpublic void testT() {double a 1.8double b 0.1double c 1.9Double d 0.

double 值的陷阱
@Test
public void testT() {
double a = 1.8;
double b = 0.1;
double c = 1.9;
Double d = 0.0;
Double e = 0.00;
System.out.println((1.7 + 0) - 1.7);
System.out.println((1.7 + 0.1) - 1.8);
System.out.println((a + b) - c);
System.out.println(NumberUtil.round((a + b) - c));
System.out.println(NumberUtil.round(a + b) - c);
System.out.println(1.9 - 1.9);
System.out.println(d.doubleValue());
System.out.println(e.doubleValue());
}

结果:
0.0
0.0
2.220446049250313E-16
0.0
0.0
0.0
0.0
0.0

两个double 值相加并不一定相等
如:
printf("%.55f", 1.9)
        # 1.8999999999999999111821580299874767661094665527343750000
        printf("%.55f", 1.8 + 0.1)
        # 1.9000000000000001332267629550187848508358001708984375000
得:    (1.8 + 0.1) - 1.9 = 2.22044604925031e-16

设计数据库时,尽量使用decimal/numeric, 而避免使用float,double 作为金额等的计算。

热点排行