最强面试题: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 我学废了,你呢,哈哈的主要内容,如果未能解决你的问题,请参考以下文章

最强面试题:BigDecimal 我学废了,你呢,哈哈

学废了......又一个面试小技巧 | 每日趣闻

学废了,堪称Android开发最全的知识体系与面试体系

Java这样的单例模式你学废了吗

音视频大合集最终篇;学废了

# yyds干货盘点 # Python列表中的深浅拷贝,你学废了嘛?