最强面试题:BigDecimal 我学废了,你呢,哈哈
Posted 码农搬砖_2020
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最强面试题:BigDecimal 我学废了,你呢,哈哈相关的知识,希望对你有一定的参考价值。
public class BigDecimalTest {
public static void main(String[] args) {
BigDecimal a = new BigDecimal(0.1);
System.out.println(a);
BigDecimal b = new BigDecimal("0.1");
System.out.println(b);
}
}
灵魂拷问:请问a和b的数值一样吗?
我以为这道题真不难,a 和 b 的唯一区别就在于 a 在调用 BigDecimal 构造方法赋值的时候传入了浮点数,而 b 传入了字符串,a 和 b 的结果应该都为 0.1,所以我认为这两种赋值方式是一样的。
但实际上,输出结果完全出乎我的意料:
BigDecimal a = new BigDecimal(0.1);
System.out.println(a); // 0.1000000000000000055511151231257827021181583404541015625
BigDecimal b = new BigDecimal("0.1");
System.out.println(b); // 0.1
这究竟又是怎么回事呢?
这就必须看官方文档了,是时候搬出 BigDecimal(double val) 的 JavaDoc 镇楼了。
One might assume that writing new BigDecimal(0.1) in Java creates a BigDecimal which is exactly equal to 0.1 (an unscaled value of 1, with a scale of 1), but it is actually equal to 0.10000000000000000555111512312578270211815834045410... ```
解释:使用 double 传参的时候会产生不可预期的结果,比如说 0.1 实际的值是 0.1000000000000000055511151231257827021181583404541015625,说白了,这还是精度的问题。
The String constructor, on the other hand, is perfectly predictable:
writing new BigDecimal(“0.1”) creates a BigDecimal which is exactly
equal to 0.1, as one would expect. Therefore, it is generally
recommended that the String constructor be used in preference to
this one.
解释:使用字符串传参的时候会产生预期的结果,比如说 new BigDecimal(“0.1”) 的实际结果就是 0.1。
以上是关于最强面试题:BigDecimal 我学废了,你呢,哈哈的主要内容,如果未能解决你的问题,请参考以下文章