1.为什么double类型的数值进行运算得不到“数学上精确”的结果?
结论:使用double类型的数值进行计算,其结果是不精确的。
原因:double类型的数值占用64bit,即64个二进制数,除去最高位表示正负符号的位,在最低位上一定会与实际数据存在误差(除非实际数据恰好是2的n次方)。我们给出的数值,在大多数情况下需要比64bit更多的位数才能准确表示出来(甚至是需要无穷多位),而double类型的数值只有64bit,后面舍去的位数一定会带来误差,无法得到“数学上精确”的结果。
2.解决精度问题可以使用使用BigDecimal类,但在构建BigDecimal对象时应使用字符串而不是double数值,否则,仍有可能引发计算精度问题解决方法
原因:double并不能准确的代表BigDecimal 16位有效数以上的数字在使用BigDecimal时创建对象。而BigDecimal所创建的对象不能使用+-*/等传统的算术运算符直接对其对象进行数学运算,必须调用相对应的(f1.add(f2))等方法。 因为方法中的参数必须是BigDecimal的对象,所以定义时应为字符串。
3.以下代码的输出结果是什么?
结果:
原因:因为输出的是字符串,在语句一中,“+”直接连接两个字符,所以分别输出100和200;而在语句二中,“+”先是进行数值类型的求和运算,再用字符串输出两个整形的和。