面试必考之Java中Math函数大全总结~体育生小东遇到美丽的数学老师

“ 数学是自然科学的基础,也是重大技术创新的基础。近年来,从人工智能、大数据到新能源等诸多领域的重大科技突破都是以数学的发展和进步为基础的。

从本质上说,计算机离不开数学。我们知道被称为“计算机之父”的冯·诺依曼就是20世纪最著名的数学家之一。而计算机最终在CPU执行的都是指令操作,每个指令最终都是以0和1这种二进制形式来存储和解析,那么0和1就是数学最基本的内容。所以说,计算机和数学密不可分。”

一定要看到最后,这个会涉及到你和老板要不要一起下班的问题~~

目录

1、体育生小东遇到了美丽的数学老师

2、场景技术实现

2.1 查看全部Math函数 

方式1:借助IDEA 的 Structure 功能

方式2:Oracle官网(推荐这种方式-官网归类做的优秀)

2.2 归类总结(面试基本功)

2.2.1 常见面试题(建议自己动手练习并总结)

2.2.2 BigInteger和BigDecimal面试题(重点关注)

3、回头看技术(面试加薪篇)

3.1 一个很经典的面试例子

3.2 为什么结果不一样

3.3 解决办法


1、体育生小东遇到了美丽的数学老师

美丽的数学老师讲完上面这段话后,把正在认真听课的体育生小东整懵圈了~~

天书吗?是不是我的智力有问题?我就是要学会找个工作而已嘛,至于这么难吗?~~

小东开始有点怀疑人生了 ~~

面试必考之Java中Math函数大全总结~体育生小东遇到美丽的数学老师_第1张图片

此时,漂亮的数学老师看到了小东的困惑。于是告诉大家不要着急,老师只是讲解数学对计算机的重要性,你们真正的学的就是记住这些公式并能够灵活应用就可以啦~~

面试必考之Java中Math函数大全总结~体育生小东遇到美丽的数学老师_第2张图片

小东悬着的心终于放松下来了,开始有板有眼地跟着美女老师学习数学公式!

2、场景技术实现

2.1 查看全部Math函数 

如果是你,是不是会到网上到处搜集然后逐一整理~~,那恭喜你近80个方法且慢慢整理吧!

那有没有好的方法呢?当然。作为一名老司机,老王直接给你出招吧,看好了!

方式1:借助IDEA 的 Structure 功能

IDEA 左下角的 Structure 标签页即可,直接从本地JDK中找到java.lang.Math类。如下图:

面试必考之Java中Math函数大全总结~体育生小东遇到美丽的数学老师_第3张图片

 

方式2:Oracle官网(推荐这种方式-官网归类做的优秀

Functions: java.lang.Mathicon-default.png?t=M3K6https://docs.oracle.com/cd/E15523_01/apirefs.1111/e12048/functmath.htm#CQLLR412

2.2 归类总结(面试基本功)

具体见官网,老王在这里只列出面试和日常业务开发使用频繁的函数。

2.2.1 常见面试题(建议自己动手练习并总结)

求几次方pow(x,y) 求x的y次方
round(x) 进行四舍五入计算
ceil(x) 向上取整(往无穷大的方向取整)
floor(x) 向下取整(往无穷小的方向取整)
max(x,y) 获取x和y中较大的那个
min(x,y) 获取x和y中较小的那个
random()生成随机数 范围是[0,1)
BigInteger和BigDecimal(这部分一般会考察精度处理问题)


2.2.2 BigInteger和BigDecimal面试题(重点关注)

 1)  int、Integer、BigInteger的区别

int属于基本数据类型;

Integer属于包装类;

BigInteger属于不可变的任意精度的整数对象

 2)double、Double、BigDecimal的区别

double属于基本数据类型

Double属于double的包装类

BigDecimal属于不可变的任意精度的十进制浮点数对象

3) BigInteger和BigDecimal在实际业务场景如何使用

BigInteger可以表示不可变的任意精度的整数,主要是针对整型大数字的处理类,在运算中可以准确地表示任何大小的整数值,而不会丢失任何信息。

由于float类型和double在计算时很容易丢失精度。但在实际商业业务当中,尤其是与计算货币值相关时,要求数字的精度很高。所以BigDecimal类用来实现任意精度的浮点数运算。

3、回头看技术(面试加薪篇)

关于Math这部分内容,其实也没有特别需要深入研究的(有感兴趣底层的课自行研究~~),重点在日常多练,熟能生巧吧。

3.1 一个很经典的面试例子

/**
 * 很经典的面试
 */
public class BigDecimalDemo {
    public static void main(String[] args) {
        compareBigDecimal();
    }

    // 请问p1和p2的值一样吗?
    public static void compareBigDecimal(){
        System.out.println("存在问题:");
        BigDecimal p1 = new BigDecimal(1.2);
        System.out.println(p1);// 1、输出什么?
        BigDecimal p2 = new BigDecimal("1.2");
        System.out.println(p2);// 2、输出什么?
        System.out.println(p1.equals(p2)); // 3、输出什么?
    }
}

答案如下: 

1、1.1999999999999999555910790149937383830547332763671875
2、1.2
3、false

如果按照第一种方式计算钱,那公司有多少都不够亏损 ,你和老板都该下班啦 ~~

3.2 为什么结果不一样

百闻不如一见,直接看BigDecimal 源码~~

面试必考之Java中Math函数大全总结~体育生小东遇到美丽的数学老师_第4张图片

 简单来说,如果传的是数值类型0.1这种数据,会出现精度转化丢失问题(坑爹~~);如果是字符串类型的0.1,则会按照原值返回。

另外,我们可以看下具体两个方法的实现方式也不同。

double参数的方式,具体实现中使用了pow的函数,这不出现精度问题才怪!

public BigDecimal(double val) {
     this(val,MathContext.UNLIMITED); //对精度进行重新调整
}

面试必考之Java中Math函数大全总结~体育生小东遇到美丽的数学老师_第5张图片 

 字符串的很中规中矩地对每个字符进行了处理,自然不会存在精度问题。

public BigDecimal(String val) {
   this(val.toCharArray(), 0, val.length());
}

3.3 解决办法

import java.math.BigDecimal;

/**
 * 很经典的面试
 */
public class BigDecimalDemo {
    public static void main(String[] args) {
        compareBigDecimal();
        bigDecimalSolve();
    }

    // 请问p1和p2的值一样吗?
    public static void compareBigDecimal(){
        System.out.println("存在问题:");
        BigDecimal p1 = new BigDecimal(1.2);
        System.out.println(p1);// 1、输出什么?
        BigDecimal p2 = new BigDecimal("1.2");
        System.out.println(p2);// 2、输出什么?
        System.out.println(p1.equals(p2)); // 3、输出什么?
    }

    public static void bigDecimalSolve(){
        System.out.println("解决方案:");
        // 方法1
        BigDecimal p1 = new BigDecimal("1.2");
        System.out.println(p1);

        // 方法2
        BigDecimal p2 = new BigDecimal(String.valueOf(1.2));
        System.out.println(p2);

        System.out.println(p1.equals(p2));
    }
}

你可能感兴趣的