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(Bi

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值