Double类型19.90变身19.89事件侦破
程序员文章站
2022-07-15 12:42:27
...
案发现场
运行结果出乎意料,并不是想要的1990;
事件跟踪
19.9 作为 Double 类型表示,二进制形式是:
1 00000000110 011111001100110011001100110011001100110011001100110
(注意中间的两个空格,如果你不知道啥意思,就去查查double的内存表示形式吧)
但是19.9 * 100 由于是二进制运算的结果是
1 00000010011 111000101111111111111111111111111111111111111111111
由于后面有n个11111所以我猜测可能发生了溢出被计算机舍去了.
于是这个数字比 1990少那么一点点(可能是 1989.99999999…)
但是你的取整操作却直接截断了后面的数字,于是成了1989
案件侦破
次侦破过程出现些许差错,BigDecimal()值得重视,String类型和double类型回执参数不通;入参为String类型(涉足参需谨慎);
代码运行截图
代码块
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