欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Double类型19.90变身19.89事件侦破

程序员文章站 2022-07-15 12:42:27
...

案发现场

Double类型19.90变身19.89事件侦破
运行结果出乎意料,并不是想要的1990;

事件跟踪

19.9 作为 Double 类型表示,二进制形式是:
1 00000000110 011111001100110011001100110011001100110011001100110
(注意中间的两个空格,如果你不知道啥意思,就去查查double的内存表示形式吧)
但是19.9 * 100 由于是二进制运算的结果是
1 00000010011 111000101111111111111111111111111111111111111111111
由于后面有n个11111所以我猜测可能发生了溢出被计算机舍去了.
于是这个数字比 1990少那么一点点(可能是 1989.99999999…)
但是你的取整操作却直接截断了后面的数字,于是成了1989

案件侦破

次侦破过程出现些许差错,BigDecimal()值得重视,String类型和double类型回执参数不通;入参为String类型(涉足参需谨慎);

代码运行截图

Double类型19.90变身19.89事件侦破

代码块

public static void main(String[] args) throws Exception {
        double d = 19.9;

        // 入参为String类型
        BigDecimal bignum1 = new BigDecimal(String.valueOf(d));
        BigDecimal bignum2 = new BigDecimal("100");
        BigDecimal bignum3 = bignum1.multiply(bignum2); //乘法运算

        // 入参为double类型
        BigDecimal bignum4 = new BigDecimal(d);
        BigDecimal bignum5 = new BigDecimal("100");
        BigDecimal bignum6 = bignum4.multiply(bignum5); //乘法运算

        System.out.println(bignum6.intValue());
        System.out.println(bignum3.intValue());
    }

案件侦破协助

https://blog.csdn.net/qingdaohaoyunpeng/article/details/50738995