9.27

今天学习了Java中数值变量的值
通过学习知道了Java中的浮点数并不为我们所想的准确值

点击查看代码
package Double;

public class DoubleTest {

    public static void main(String args[]) {
        System.out.println("0.05 + 0.01 = " + (0.05 + 0.01));
        System.out.println("1.0 - 0.42 = " + (1.0 - 0.42));
        System.out.println("4.015 * 100 = " + (4.015 * 100));
        System.out.println("123.3 / 100 = " + (123.3 / 100));
    }
}
运行结果为:
点击查看代码
0.05 + 0.01 = 0.060000000000000005
1.0 - 0.42 = 0.5800000000000001
4.015 * 100 = 401.49999999999994
123.3 / 100 = 1.2329999999999999
可见Java中的浮点数并不是如我们输入时的准确。 其原因为计算机进行的是二进制运算,我们输入的十进制数字会先转换成二进制,进行运算后再转换为十进制输出。 而N进制可以理解为:数值×基数的幂,Double类型的数值占用64bit,即64个二进制数,除去最高位表示正负符号的位,在最低位上一定会与实际数据存在误差(除非实际数据恰好是2的n次方)。 总结为:在Java中double与flout类为了加快运算,导致在进制换算上存在一些问题,例如有的数不能完全转化,只能无限趋近于之个数。

解决办法为使用BigDecimal类

点击查看代码
package Double;
import java.math.BigDecimal;
public class BigDecimalTest
{
    public static void main(String[] args)
    {
        java.math.BigDecimal f1 = new java.math.BigDecimal("0.05");
        java.math.BigDecimal f2 = java.math.BigDecimal.valueOf(0.01);
        java.math.BigDecimal f3 = new java.math.BigDecimal(0.05);
        System.out.println("使用String构造BigDecimal");
        System.out.println("0.05 + 0.01 = " + f1.add(f2));
        System.out.println("0.05 - 0.01 = " + f1.subtract(f2));
        System.out.println("0.05 * 0.01 = " + f1.multiply(f2));
        System.out.println("0.05 / 0.01 = " + f1.divide(f2));
        System.out.println("使用double构造BigDecimal");
        System.out.println("0.05 + 0.01 = " + f3.add(f2));
        System.out.println("0.05 - 0.01 = " + f3.subtract(f2));
        System.out.println("0.05 * 0.01 = " + f3.multiply(f2));
        System.out.println("0.05 / 0.01 = " + f3.divide(f2));
    }
}
运行结果为:
点击查看代码
使用String构造BigDecimal
0.05 + 0.01 = 0.06
0.05 - 0.01 = 0.04
0.05 * 0.01 = 0.0005
0.05 / 0.01 = 5
使用double构造BigDecimal
0.05 + 0.01 = 0.06000000000000000277555756156289135105907917022705078125
0.05 - 0.01 = 0.04000000000000000277555756156289135105907917022705078125
0.05 * 0.01 = 0.0005000000000000000277555756156289135105907917022705078125
0.05 / 0.01 = 5.000000000000000277555756156289135105907917022705078125

可见使用double构造时仍会出错,其原因为double类型无法精确的构造BigDecimal对象,及无法精确定位。
posted @ 2024-09-28 21:35  QixunQiu  阅读(27)  评论(0编辑  收藏  举报