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 @   QixunQiu  阅读(50)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示