Java基础

11.3 Java 数值类使用

2021-04-23  本文已影响0人  acc8226

java.lang.Math(final类)

Java 语言是彻底地面向对象语言,哪怕是进行数学运算也封装到一个类中的,这个类是 java.lang.Math,Math 类是 final 的不能被继承。Math 类中包含用于进行基本数学运算的方法,如指数、对数、平方根和三角函数等。这些方法分类如下:

  1. 舍入方法
  1. 最大值和最小值
  1. 绝对值
  1. 三角函数:
  1. 对数运算:static double log(double a)`,返回a的自然对数。

  2. 平方根:static double sqrt(double a)`,返回a的正平方根。

  3. 幂运算:static double pow(double a, double b)`,返回第一个参数的第二个参数次幂的值。

  4. 计算随机值:static double random(),返回大于等于 0.0 且小于 1.0随机数(左闭右开))。

  5. 常量
    圆周率PI,自然对数的底数E。

大数值

对货币等大值数据进行计算时,int、long、float 和 double 等基本数据类型已经在精度方面不能满足需求了。为此 Java 提高了两个大数值类:BigInteger 和 BigDecimal,这里两个类都继承自 Number 抽象类。

BigInteger

java.math.BigInteger 是不可变的任意精度的大整数。BigInteger 构造方法有很多,其中字符串参数的构造方法有两个:

BigInteger 提供多种方法,下面列举几个常用的方法:
int compareTo(BigInteger val):将当前对象与参数 val 进行比较,方法返回值是 int,如果返回值是 0,则相等;如果返回值小于 0,则此对象小于参数对象;如果返回值大于 0,则此对象大于参数对象。

BigDecimal

java.math.BigDecimal 是不可变的任意精度的有符号十进制数。BigDecimal构造方法有很多:

BigDecimal 提供多种方法,下面列举几个常用的方法:

注意:如果传入的字符串是一个非法的数值,例如空串、含有字母,这时候就会报异常 NumberFormatException

new BigDecimal("");
new BigDecimal("m");
new BigDecimal("v1");
new BigDecimal(" 1");
new BigDecimal("1 ");

都会报这个 NumberFormatException。

RoundingMode 枚举介绍

  1. ROUND_DOWN
BigDecimal b = new BigDecimal("2.225667").setScale(2, BigDecimal.ROUND_DOWN);
System.out.println(b);//2.22 直接去掉多余的位数
  1. ROUND_UP
BigDecimal c = new BigDecimal("2.224667").setScale(2, BigDecimal.ROUND_UP);
System.out.println(c);//2.23 跟上面相反,进位处理
  1. ROUND_CEILING
BigDecimal f = new BigDecimal("2.224667").setScale(2, BigDecimal.ROUND_CEILING);
System.out.println(f);//2.23 如果是正数,相当于BigDecimal.ROUND_UP
 
BigDecimal g = new BigDecimal("-2.225667").setScale(2, BigDecimal.ROUND_CEILING);
System.out.println(g);//-2.22 如果是负数,相当于BigDecimal.ROUND_DOWN
```java

4. ROUND_FLOOR
```java
BigDecimal h = new BigDecimal("2.225667").setScale(2, BigDecimal.ROUND_FLOOR);
System.out.println(h);//2.22 如果是正数,相当于BigDecimal.ROUND_DOWN
        
BigDecimal i = new BigDecimal("-2.224667").setScale(2, BigDecimal.ROUND_FLOOR);
System.out.println(i);//-2.23 如果是负数,相当于BigDecimal.ROUND_HALF_UP
  1. ROUND_HALF_UP - 这是标准的四舍五入。
BigDecimal d = new BigDecimal("2.225").setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("ROUND_HALF_UP"+d); //2.23  四舍五入(若舍弃部分>=.5,就进位)
  1. ROUND_HALF_DOWN
BigDecimal e = new BigDecimal("2.225").setScale(2, BigDecimal.ROUND_HALF_DOWN);
System.out.println("ROUND_HALF_DOWN"+e);//2.22  四舍五入(若舍弃部分>.5,就进位)
  1. ROUND_HALF_EVEN
BigDecimal j = new BigDecimal("2.225").setScale(2, BigDecimal.ROUND_HALF_EVEN);
System.out.println(j);//2.22 如果舍弃部分左边的数字为偶数,则作   ROUND_HALF_DOWN 
        
BigDecimal k = new BigDecimal("2.215").setScale(2, BigDecimal.ROUND_HALF_EVEN);
System.out.println(k);//2.22 如果舍弃部分左边的数字为奇数,则作   ROUND_HALF_UP
        
System.out.println("4.05: "+new BigDecimal("4.05").setScale(1, BigDecimal.ROUND_HALF_EVEN));//4.05: 4.0  down
System.out.println("4.15: "+new BigDecimal("4.15").setScale(1, BigDecimal.ROUND_HALF_EVEN));//4.15: 4.2  up
System.out.println("4.25: "+new BigDecimal("4.25").setScale(1, BigDecimal.ROUND_HALF_EVEN));//4.25: 4.2  down
System.out.println("4.35: "+new BigDecimal("4.35").setScale(1, BigDecimal.ROUND_HALF_EVEN));//4.35: 4.4  up
System.out.println("4.45: "+new BigDecimal("4.45").setScale(1, BigDecimal.ROUND_HALF_EVEN));//4.45: 4.4  down
System.out.println("4.55: "+new BigDecimal("4.55").setScale(1, BigDecimal.ROUND_HALF_EVEN));//4.55: 4.6  up
System.out.println("4.65: "+new BigDecimal("4.65").setScale(1, BigDecimal.ROUND_HALF_EVEN));//4.65: 4.6  down
        
System.out.println("3.05: "+new BigDecimal("3.05").setScale(1, BigDecimal.ROUND_HALF_EVEN));//3.05: 3.0  down
System.out.println("3.15: "+new BigDecimal("3.15").setScale(1, BigDecimal.ROUND_HALF_EVEN));//3.15: 3.2  up
System.out.println("3.25: "+new BigDecimal("3.25").setScale(1, BigDecimal.ROUND_HALF_EVEN));//3.25: 3.2  down
System.out.println("3.35: "+new BigDecimal("3.35").setScale(1, BigDecimal.ROUND_HALF_EVEN));//3.35: 3.4  up
System.out.println("3.45: "+new BigDecimal("3.45").setScale(1, BigDecimal.ROUND_HALF_EVEN));//3.45: 3.4  down
System.out.println("3.55: "+new BigDecimal("3.55").setScale(1, BigDecimal.ROUND_HALF_EVEN));//3.55: 3.6  up
System.out.println("3.65: "+new BigDecimal("3.65").setScale(1, BigDecimal.ROUND_HALF_EVEN));//3.65: 3.6  down

8.ROUND_UNNECESSARY

BigDecimal l = new BigDecimal("2.215").setScale(3, BigDecimal.ROUND_UNNECESSARY);
System.out.println(l);
//断言请求的操作具有精确的结果,因此不需要舍入。
//如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。

IDEA 更推荐使用 public BigDecimal setScale(int newScale, RoundingMode roundingMode),而非第二个参数传入的是 int 类型的入参。

使用 BigDecimal 总结

数据库数据类型decimal理解

MySQL DECIMAL数据类型用于在数据库中存储精确的数值。

例如语法:column_name DECIMAL(P, D)

其中P表示的是有效数字的位数,D 表示是小数的位数,D 小于或等于P。

理解可看下面代码:

create table decimal_test(
id int auto_increment PRIMARY key,
score decimal(5,2) -- 取值范围是** -999.99 到 999.99**
);

select * from decimal_test;
-- 正数:
insert into decimal_test(score) VALUES(1.23); -- 1.23
insert into decimal_test(score) VALUES(123.45); -- 123.45
insert into decimal_test(score) VALUES(123.455); -- 123.46
insert into decimal_test(score) VALUES(123.451); -- 123.45
insert into decimal_test(score) VALUES(123.451123); -- 123.45
insert into decimal_test(score) VALUES(12345.451123); -- Out of range value for column 'score'
insert into decimal_test(score) VALUES(9999.451123); -- Out of range value for column 'score'
insert into decimal_test(score) VALUES(999.451123234324); -- 999.45
insert into decimal_test(score) VALUES(999.999999999); -- Out of range value for column 'score'
insert into decimal_test(score) VALUES(999.99123); -- 999.99
-- 负数:
insert into decimal_test(score) VALUES(-1.23); -- -1.23
insert into decimal_test(score) VALUES(-12.34); -- -12.34
insert into decimal_test(score) VALUES(-123.45); -- -123.45
insert into decimal_test(score) VALUES(-999.45); -- -999.45
insert into decimal_test(score) VALUES(-12343); -- Out of range value for column 'score'
insert into decimal_test(score) VALUES(12343); -- Out of range value for column 'score'
insert into decimal_test(score) VALUES(1234); -- Out of range value for column 'score'
insert into decimal_test(score) VALUES(123); -- 123
insert into decimal_test(score) VALUES(-123); -- -123
insert into decimal_test(score) VALUES(-999.99); -- -999.99
insert into decimal_test(score) VALUES(-9990.99); -- Out of range value for column 'score'
insert into decimal_test(score) VALUES(-1234.99); -- Out of range value for column 'score'
insert into decimal_test(score) VALUES(-1234); -- Out of range value for column 'score'

数值格式化

我们经常要将数字进行格式化,比如取 2 位小数,这是最常见的。Java 提供 DecimalFormat 类,帮你用最快的速度将数字格式化为你需要的样子。下面是常用的例子:

import java.text.DecimalFormat;

public class Test {
    public static void main(String[] args){
        double pi=3.1415927;//圆周率
        // 取一位整数 
        System.out.println(new DecimalFormat("0").format(pi));//3
        // 取一位整数和两位小数  
        System.out.println(new DecimalFormat("0.00").format(pi));//3.14
        // 取两位整数和三位小数,整数不足部分以0填补。  
        System.out.println(new DecimalFormat("00.000").format(pi));//03.142  
        // 取所有整数部分  
        System.out.println(new DecimalFormat("#").format(pi));//3  
        // 以百分比方式计数,并取两位小数  
        System.out.println(new DecimalFormat("#.##%").format(pi));//314.16%  
        
        long c=299792458;//光速  
        // 显示为科学计数法,并取五位小数  
        System.out.println(new DecimalFormat("#.#####E0").format(c));//2.99792E8  
        // 显示为两位整数的科学计数法,并取四位小数  
        System.out.println(new DecimalFormat("00.####E0").format(c));//29.9792E7  
        // 每三位以逗号进行分隔。  
        System.out.println(new DecimalFormat(",###").format(c));//299,792,458  
        // 将格式嵌入文本  
        System.out.println(new DecimalFormat("光速大小为每秒,###米").format(c)); //光速大小为每秒299,792,458米
    }
}

DecimalFormat 类主要靠 # 和 0 两种占位符号来指定数字长度。0 表示如果位数不足则以 0 填充,# 表示只要有可能就把数字拉上这个位置。上面的例子包含了差不多所有的基本用法,如果你想了解更多,请参考 DecimalFormat 类的文档。

数据类型转换的小结

取小于等于该数组的数(取整)
int i = (int)12.34;
int j = Math.round(12.34)

int 转 char
char c = (char)c;

字符串转 int, 出错会抛 runtime 异常
int i=Integer.parseInt(s);

int 转字符串
String s = String.valueOf(i);

四舍五入
Math.round()

参考

【java】BigDecimal.setScale用法总结 - Angel挤一挤 - 博客园 https://www.cnblogs.com/sxdcgaq8080/p/12123917.html

数据库数据类型 decimal 理解 - 学无止境BS - 博客园
https://www.cnblogs.com/chenweipeng/p/9627659.html

上一篇 下一篇

猜你喜欢

热点阅读