精确

如果要求精确的答案,请避免使用float和double

情到浓时终转凉″ 提交于 2019-11-29 02:03:35
float 和 double 类型的主要设计目的是为了 科学计算和工程计算 。它们 执行二进制浮点运算 ,这是为了在广域数值范围上提供较为精确的快速 近似计算 而精心设计的。 然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合。 因为要让一个float或者double精确地表示0.1(或者10的任何负数次方值)是不可能的, float和double类型对于货币计算尤为不合适 , 因为要让一个float或double精确地表示0.1或10的任何其他负数次方值是不可能的。 比如System.out.println(2.0-1.1)将会打印0.899999999999999,而不是你所希望的0.9,这种舍入错误产生的原因是 浮点数实际上是用二进制系统实现的 ,而分数1/10在二进制系统中没有精确的表示,其道理就如同在十进制系统中无法精确表示1/3一样;再比如0.5在二进制系统中有精确表示,而0.55在二进制系统中没有精确表示。 System.out.println(1.03 – .42); System.out.println(1.00 – 9 * .10); 输出结果为: 0.6100000000000001 0.09999999999999998 你可能会认为,只要在打印之前将结果做一下舍入就可以解决这个问题,但遗憾的是,这种做法并不总是可行。 例如