* 使用BigDecimal需要注意的事项:
 1、两个BigDecimal值不能使用“ +, -, *, / ” 进行加减乘除,要使用“ add, substract, multiply, divide ”;
 2、两个BigDecimal值比较使用compareTo方法, 比较结果有-101, 分别表示小于, 等于, 大于; 对于0, 可以使用BigDecimal.ZERO表示;
 3、提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 定精度,以后的数字四舍五入;
 4、因double有效位数为 16位这就会出现存储小数位数不够的情况,这种情况下就会出现误差,解决方法就是使用BigDecimal,它的有
     效长度足够长可存储 小数位数因此可代替double来进行加减乘除, 金额必须是完全精确的计算, 故不能使用double或者float, 而
     应该采用java.math.BigDecimal.
 5、mysql数据库设计
     BigDecimal在进行入库时, 数据库选择decimal类型, 长度可以自定义, 如18; 小数点我们项目中用的是2, 保留2位小数. 此外还要注意的就是默认值,
     一定写成0.00, 不要用默认的NULL, 否则在进行加减排序等操作时, 会带来转换的麻烦!
     如 :`balance` decimal(18,2) DEFAULT '0.00' COMMENT '账户余额',
 */
 
 

1、浮点型变量(float和double)

 

带小数的变量在Java中称为浮点型,Java的浮点型有两种:float和double。

float类型代表单精度浮点数,占4个字节、32位。double类型代表双精度浮点数,占8个字节、64位。

Java语言的浮点数有两种表示形式:

1)十进制数形式:例如3.14、314.0、0.314。浮点数必须包含一个小数点,否则会被当成int类型处理。

2)科学计数法形式:例如3.14e2(即3.14*102),31.4e-2(即314*10-2)。

 必须指出的是,只有浮点型的数值才可以使用科学计数法形式表示。例如31400是一个int类型的值,但314E2则是浮点类型的值。

Java语言的浮点类型默认是double类型,如果希望Java把一个浮点类型值当成float类型处理,应该在这个浮点类型值的后面紧跟F或f。例如3.14代表一个double类型的值,占64位的内存空间;3.14F才表示一个float类型的值,占32位的内存空间。当然也可以在一个浮点数后添加D或d后缀,强制指定double类型,但通常没必要。

Java还提供了三个特殊的浮点数值:正无穷大、负无穷大和非数,用于表示溢出和出错。例如,使用一个正数除以0将得到正无穷大,使用负数除以0将得到负无穷大,0.0除以0.0或对一个负数开方将得到一个非数。正无穷大通过Double或Float类的POSITIVE_INFINITY表示;负无穷大通过Double或Float类的NEGATIVE_INFINITY表示,非数通过Double或Float类的NaN表示。

必须指出的是,所有的正无穷大数值都是相等的,所有的负无穷大数值都是相等的;而NaN不与任何数值相等,甚至和NaN都不相等。

 注:只有浮点数除以0才可以得到正无穷大或负无穷大,如果一个整数除以0则会抛出一个异常:ArithmeticException:/by zero(除以0异常)。

 

2、BigDecimal

 

 由于Java浮点数使用二进制数据的科学计数法表示,所以可能不能精确表示一个浮点数。如果需要进行不产生误差的精确数字计算,需要使用BigDecimal类。

先看如下程序:

1)浮点数的比较一

float f = 0.1f;

double d = 1.0/10;

//结果为false

System.out.println(f==d);

2)浮点数的比较二

float d1 = 423432423f;

float d2 = d1+1;

if(d1==d2){

//输出结果为 d1==d2

System.out.println("d1==d2");

}else{

上面程序运行结果表明,Java的浮点数会发生精度丢失,尤其在算术运算时更易发生这种情况,所以,不要使用浮点数进行运算和比较!

创建BigDecimal对象的构造器有很多,建议使用BigDecimal(String val)这个构造器,因为这个结果是可以预知的,例如,new BigDecimal("0.2")将创建一个BigDecimal,它正好等于预期的0.2,因此通常建议优先使用基于String的构造器。

如果必须使用double浮点数作为BigDecimal构造器的参数时,不要直接将该double浮点数作为构造器参数创建BigDecimal对象,而是通过BigDecimal.valueOf(double value)静态方法来创建BigDecimal对象。

总结:

老鸟建议:浮点类型float,double的数据不适合在不容许舍入误差的金融计算领域。如果需要进行不产生舍入误差的精确数字计算,需要使用BigDecimal类。

菜鸟雷区:不要使用浮点数进行比较!很多新人甚至很多理论不扎实的有工作经验的程序员也会犯这个错误!需要比较请使用BigDecimal类。

觉得内容还不错的话,给我点个“在看”呗

 

Java 中计算注意!!!的更多相关文章

  1. Java中计算对象的大小

    一.计算对象大小的方法 Java中如何计算对象的大小呢,找到了4种方法: 1.java.lang.instrument.Instrumentation的getObjectSize方法: 2.BTrac ...

  2. JAVA中计算两个日期时间的差值竟然也有这么多门道

    上半年春招的时候,作为面试官,对于面试表现的不错的同学会要求其写一小段代码看看.题目很简单: 给定一个日期,然后计算下距离今天相差的天数. 本以为这么个问题就是用来活跃面试氛围的,但是结果却让人大跌眼 ...

  3. java中计算一段时间内白天的时间和夜晚的时间

    之前,采用拼接字符串的形式,不断地在Date类型和Long类型之间转换,实在是太过于麻烦,后来采取了这种思路:假设我们将22:00 ~ 10:00 视为夜间时间,则我们先计算出10:00 相对于当天的 ...

  4. java中计算两个日期之间天数的程序设计。

    //用java编写出一个以下方法计算两个日期之间天数的程序设计. import java.util.regex.Matcher; import java.util.regex.Pattern; pub ...

  5. java中计算两个时间差

    java计算时间差及比较时间大小 比如:现在是2004-03-26 13:31:40 过去是:2004-01-02 11:30:24 我现在要获得两个日期差,差的形式为:XX天XX小时XX分XX秒 方 ...

  6. 关于Java中计算日期差值不准确问题

    1.字符串日期相减 如:2016-4-1,必须先将此字符串转成Date对象,并且, 格式必须为:yyyy—MM—dd  HH:mm:ss. 如果不转就直接计算(2016-4-1)两个这样的日期,则误差 ...

  7. JAVA中计算两个时间相差多少 天,时,分,秒

    1: import java.util.Date; 2: 3: public class ShowTimeInterval{ 4: public void ShowTimeInterval(Date ...

  8. java中计算时间差

    Calendar cale = null; SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss" ...

  9. Java中Double类型计算问题

    public class Test{    public static void main(String args[]){        System.out.println(0.05+0.01);  ...

随机推荐

  1. pytest(3)-测试命名规则

    前言 在自动化测试项目中,单元测试框架运行时需要先搜索测试模块(即测试用例所在的.py文件),然后在测试模块中搜索测试类或测试函数,接着在测试类中搜索测试方法,最后加入到队列中,再按执行顺序执行测试. ...

  2. 提高可测性-Mock平台设计和整体规划

    微信搜索[大奇测试开],关注这个坚持分享测试开发干货的家伙. 平台背景 从业务特性上,不少测试的服务很多是依赖第三方的接口的,比如其中的支付场景,就需要很多状态的返回进行验证,但大部分服务提供商没有很 ...

  3. Redis原理再学习04:数据结构-哈希表hash表(dict字典)

    哈希函数简介 哈希函数(hash function),又叫散列函数,哈希算法.散列函数把数据"压缩"成摘要,有的也叫"指纹",它使数据量变小且数据格式大小也固定 ...

  4. ctf.show-misc31

    (感谢阿姨)这个misc还是属于比较阴间的,并且学到了一个新的编码形式,直接开搞 下载附件得到压缩包,解压需要密码,可以看到没有输入密码解压也是得到了一个"file"文件,以txt ...

  5. k8s核心资源之:标签(label)

    简介 label是标签的意思,一对 key/value ,被关联到对象上,k8s中的资源对象大都可以打上标签,如Node.Pod.Service 等 一个资源可以绑定任意多个label,k8s 通过  ...

  6. 国内专业web报表工具,完美解决中国式报表难题

    近几年报表工具的热度不断上升,很多企业都用上了全新的报表工具,主要是企业数据化转型已经成为趋势.在进行选型的时候,很多企业最好都选择国内的报表工具,相信一些人不知道为什么国内的报表工具表现比国外的好. ...

  7. oj教程--学习顺序

    1.数组 2.排序 3.递归 4.栈 5.队列 6.链表 7.二叉树 8.大数或高精度 9.枚举 10.搜索 11.字符串问题 12.贪心 13.最短路径 14.动态规划

  8. ASP.NET Core 6框架揭秘实例演示[15]:针对控制台的日志输出

    针对控制台的ILogger实现类型为ConsoleLogger,对应的ILoggerProvider实现类型为ConsoleLoggerProvider,这两个类型都定义在 NuGet包"M ...

  9. Pandas:plot相关函数

    0.注意事项 及 各种错误 1)绘制bar图时,如果出现重复的x值被合并到一个情况(导致X轴应该显示内容有缺失),可能是由于Pandas版本太低: 2)无法设置中文title,在代码中加入两句话: p ...

  10. Pycharm:在Pycharm中使用控制台命令

    最下方跟Console同行的Terminal,其中输入指令就相当于在cmd命令行窗口输入指令