我是靠谱客的博主 酷炫仙人掌,最近开发中收集的这篇文章主要介绍java 数值运算,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、整数运算

整数类型
1、Java有四种整数类型:byte、short、int和long。
2、Java默认整数计算的结果是int类型。
3、整数的字面量是int类型。
4、若字面量超过int类型的最大值,则字面量是long类型,那么后面要用L(或l)表示该值是long类型。

整数运算
Java的整数运算遵循四则运算规则,可以使用任意嵌套的小括号。四则运算规则和初等数学一致。整数的数值表示不但是精确的,而且整数运算永远是精确的,即使是除法也是精确的,因为两个整数相除只能得到结果的整数部分。

溢出
要特别注意,整数由于存在范围限制,如果计算结果超出了范围,就会产生溢出,而溢出不会出错,却会得到一个奇怪的结果。

二、浮点数运算

浮点数类型
1、浮点类型用于表示小数的数据类型。
2、浮点数原理:也就是二进制科学计数法。
3、Java的浮点类型有float和double两种。
4、Java默认浮点类型计算的结果是double类型,字面量也是double类型。

float
1、float类型共32位,1位为符号位, 指数8位, 尾数23位。
2、float的精度是23位(即能精确表达23位的数,超过就被截取了)。
3、float存储数据的范围大于int类型,但精度比int要小,因为int的精度是31位。

double
1、double类型,1位符号位,11位指数,52位尾数。
2、double范围远远大于long,但double精度不如long。

浮点数为什么会失真?
什么是浮点数?其实就是实数(real number)的一种表示方法。实数大家都知道,包括有理数和无理数,比如说3,3/4, 0.85, pi (3.1415926…)等。那在计算机里面,如何来表示实数呢?有两种方法:定点数和浮点数。定点数很直观,比如说你有5位数字位,你可以表示110.82或者0.0001,搁在计算机里无非就是把十进制换成二进制就行。但是定点数有一个缺点,费空间,给定一个长度表示不了多大的数字。最直观的比较就是Java里integer和float,同为4个字节,但是能够表示的值的范围就差别很大。所以,为了在有限的存储空间里尽可能表现更大范围的实数,浮点数就应运而生了。而浮点数存储的标准大多遵从于IEEE754标准,而该标准的实现原理就决定了有些浮点数不可能被精确表述,只能是一个近似值。

计算机无法存储一个无限循环的数,只能将这个数零舍一入(二进制版的四舍五入),这是浮点数存在误差的根本原因。我们对浮点数并不陌生,最常见的例子就是科学计数法(scientific notation),比如把987654.321表示为9.87654321X10^5。浮点数的通用表示方法包括一个基数(base,通常为偶数)和一个精度p。比如 base = 10 and p = 3,那么0.1就表示为1.00 X 10^-1. 如果 base= 2 and p = 24, 那么0.1就不能被精确表述,只能是个近似值:1.10011001100110011001101 × 2-4.。用二进制数表示小数,可能会存在一个非常大的问题:一些本来不是无限循环的十进制小数,表示成二进制之后成了无限循环小数。如0.6用二进制表示就会成为一个无限循环的小数。

既然浮点数会失真,那为什么还要用它呢?那为什么在Java里不干脆都用BigDecimal得了。
因为double跟BigDecimal比,有效率上和空间上的优势,double节省memory,cpu,而且用double的代码比BigDecimal也更简洁,当对结果的正确性有一定的容忍程度的地方可以使用double。而如果你要精确表示某个值,经常举的例子就是比如涉及到钱的字段,推荐使用BigDecimal。当然还有一种办法是使用long,通过将小数乘以某个倍数(比如100,1000)来将其转换为一个整数。

Java里浮点数运算有些什么注意事项
如果你用double来表示price或者quantity之类的信息,或者这些字段的定义是你没有办法更改或决定的,那你至少要保证的一点就是利用BigDecimal来完成算术运算。因为如果使用double来直接运算,运算过程中就会产生很多误差。

三、BigDecimal

1、简介
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。

2、构造器描述
BigDecimal(int) 创建一个具有参数所指定整数值的对象。
BigDecimal(double) 创建一个具有参数所指定双精度值的对象。 //不推荐使用
BigDecimal(long) 创建一个具有参数所指定长整数值的对象。
BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象。//推荐使用

3、方法描述
add(BigDecimal) BigDecimal对象中的值相加,然后返回这个对象。
subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。
multiply(BigDecimal) BigDecimal对象中的值相乘,然后返回这个对象。
divide(BigDecimal) BigDecimal对象中的值相除,然后返回这个对象。
toString() 将BigDecimal对象的数值转换成字符串。
doubleValue() 将BigDecimal对象中的值以双精度数返回。
floatValue() 将BigDecimal对象中的值以单精度数返回。
longValue() 将BigDecimal对象中的值以长整数返回。
intValue() 将BigDecimal对象中的值以整数返回。

4、特别说明一下,为什么BigDecimal(double) 不推荐使用
1、参数类型为double的构造方法的结果有一定的不可预知性。有人可能认为在Java中写入newBigDecimal(0.1)所创建的BigDecimal正好等于 0.1(非标度值 1,其标度为 1),但是它实际上等于0.1000000000000000055511151231257827021181583404541015625。这是因为0.1无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)。这样,传入到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。

2、另一方面,String 构造方法是完全可预知的:写入 newBigDecimal(“0.1”) 将创建一个 BigDecimal,它正好等于预期的 0.1。因此,比较而言,通常建议优先使用String构造方法。当double必须用作BigDecimal的源时,请使用Double.toString(double)转成String,然后使用String构造方法,或使用BigDecimal的静态方法valueOf。
5、进行除法运算的时候,结果不能整除,有余数,这个时候会报java.lang.ArithmeticException
这边特别提一下,如果进行除法运算的时候,结果不能整除,有余数,这个时候会报java.lang.ArithmeticException: ,这边我们要避免这个错误产生,在进行除法运算的时候,针对可能出现的小数产生的计算,必须要多传两个参数

   divide(BigDecimal,保留小数点后几位小数,舍入模式)
   舍入模式
	ROUND_CEILING    //向正无穷方向舍入
	ROUND_DOWN    //向零方向舍入
	ROUND_FLOOR    //向负无穷方向舍入
	ROUND_HALF_DOWN    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5
	ROUND_HALF_EVEN    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP,如果是偶数,使用ROUND_HALF_DOWN
	ROUND_HALF_UP    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6,也就是我们常说的“四舍五入”
	ROUND_UNNECESSARY    //计算结果是精确的,不需要舍入模式
	ROUND_UP    //向远离0的方向舍入

6、需要对BigDecimal进行截断和四舍五入可用setScale方法

四、Math类

1、简介
在Math类中提供了众多数学函数方法,主要包括三角函数方法、指数函数方法、取整函数方法、取最大值、最小值以及平均值函数方法,这些方法都被定义为static形式,所以在程序中应用比较简便。 Math.数学方法

在Math类中除了函数方法之外还存在一些常用数学变量,如PI、E等。这些数学常量作为Math类的成员变量出现,调用起来也很简单。Math.PI; Math.E;
2.常用数学运算类
(1)三角函数方法(需要注意:通常角度和弧度转换是不精确的)

        public static double sin(double a): 返回角的三角正弦
		public static double cos(double a): 返回角的三角余弦
		public static double tan(double a): 返回角的三角正切
		public static double asin(double a): 返回一个角的反正弦
		public static double acos(double a): 返回一个角的反余弦
		public static double atan(double a): 返回一个角的反正切
		public static double toRadians(double angdeg): 将角度转换为弧度
		public static double toDegrees(double angrad): 将弧度转换为角度

(2)指数函数方法

        public static double exp(double a): 用于获取e的a次方,即取e^a
		public static double log(double a): 用于取自然对数,即取lna的值
		public static double log10(double a): 用于取底数为10的对数
		public static double sqrt(double a): 用于取a的平方根,其中a的值不能为负值
		public static double cbrt(double a): 用于取a的立方根
		public static double pow(double a,double b): 用于取a的b次方

(3)取整函数方法

		public static double ceil(double a): 返回大于等于参数的最小整数
		public static double floor(double a): 返回小于等于参数的最大整数
		public static double rint(double a): 返回与参数最接近的整数,如果两个同为整数且同样接近,则结果       取偶数
		public static int round(float a): 将参数加上0.5后返回与参数最近的整数
		public static long round(double a): 将参数加上0.5后返回与参数最近的整数,然后强制转换为长整型

(4)取最大值、最小值、绝对值函数方法

        public static double max(double a,double b): 取a与b之间的最大值
		public static int min(int a,int b): 取a与b之间的最小值,参数为整数
		public static long min(long a,long b): 取a与b之间的最小值,参数为长整型
		public static float min(float a,float b): 取a与b之间的最小值,参数为浮点型
		public static double min(double a,double b): 取a与b之间的最小值,参数为双精度型
		public static int abs(int a): 返回整数参数的绝对值
		public static long abs(long a): 返回长整型参数的绝对值
		public static float abs(float a): 返回浮点型参数的绝对值
		public static double abs(double a): 返回双精度型参数的绝对值

最后

以上就是酷炫仙人掌为你收集整理的java 数值运算的全部内容,希望文章能够帮你解决java 数值运算所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部