博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BigDecimal
阅读量:6263 次
发布时间:2019-06-22

本文共 2032 字,大约阅读时间需要 6 分钟。

float和double类型的主要为了科学计算和工程计算而设计的,它们执行二进制浮点运算,这时为了在广泛的数值范围上提供较为精确的近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合。通常商业计算往往需要BigDecimal来计算精确要求比较高的数值。比如

 

public static void main(String[] args) {        System.out.println(0.07 + 0.02);        System.out.println(0.58 - 0.42);        System.out.println(1.005 * 100);        System.out.println(15.1 / 1000);} 输出的结果为: 0.09000000000000001 0.15999999999999998 100.49999999999999 0.015099999999999999

 

无论是在任何环境下,都需要将代码转为二进制机器码才能让机器识别,当浮点数直接输出时,会保持精度,而当浮点数进行计算后,可能会丢失精度,这时就需要BigDecimal来进行计算。

1.创建BigDecimal

BigDecimal中有一个以双精度浮点数为参数的构造函数,实际上传入浮点数进行计算时还是会精度丢失。

 

 

public static void main(String[] args) {    BigDecimal num1 = new BigDecimal(1.005);  BigDecimal num2 = new BigDecimal(100);  BigDecimal num3 = new BigDecimal("1.005");  BigDecimal num4 = new BigDecimal("100");  System.out.println(num1.multiply(num2));  System.out.println(num3.multiply(num4));} 输出分别为:100.49999999999998934185896359849721193313598632812500100.500

 

 

 

但是可以发现传入字符串时得到了精确的结果,还有BigDecimal.valueOf(double val)也可以得到精确地结果,可以看下面BigDecimal.valueOf(double val)的源码

public static BigDecimal valueOf(double val) {        // Reminder: a zero double returns '0.0', so we cannot fastpath        // to use the constant ZERO.  This might be important enough to        // justify a factory approach, a cache, or a few private        // constants, later.        return new BigDecimal(Double.toString(val));    }

此方法先是将参数转为了String类型,然后再调用参数为String类型的构造参数,所以在用BigDecimal时,尽量用new BigDecimal(String val) 或 BigDecimal.valueof(double val)来保证得到精确的结果

2.compareTo

BigDecimal比较大小用compareTo()。

 

public static void main(String[] args) {    System.out.println(BigDecimal.valueOf(0.05).compareTo(BigDecimal.valueOf(0.04)));    System.out.println(BigDecimal.valueOf(0.04).compareTo(BigDecimal.valueOf(0.04)));    System.out.println(BigDecimal.valueOf(0.03).compareTo(BigDecimal.valueOf(0.04)));}  输出为: 1 0 -1

 

BigDecimal.compareTo(BigDecimal val)

当BigDecimal比val大时返回1,

当BigDecimal小于val时返回-1,

当BigDecimal等于val时返回0。

 

转载于:https://www.cnblogs.com/ly10/p/6956907.html

你可能感兴趣的文章
《Spark官方文档》Spark Streaming编程指南(二)
查看>>
使用stream操作表达更高级的数据处理请求, Part 1
查看>>
RHCSA 系列(二): 如何进行文件和目录管理
查看>>
《HTML5开发手册》——2.6 初学者“菜谱”:使用s元素显示不准确或不相关的内容...
查看>>
idea 两种启动maven项目方式
查看>>
《软件测试技术大全:测试基础 流行工具 项目实战(第3版)》—第1章1.4节小结...
查看>>
《UX设计之道——以用户体验为中心的Web设计(第2版)》一1.2 关于用户体验设计师...
查看>>
《面向机器智能的TensorFlow实践》一1.9 高歌猛进
查看>>
《CCNA学习指南:数据中心(640-911)》——2.6 笔试实验
查看>>
【云栖风向标】VOL.3:阿里云:对不起,这个官司我不服!
查看>>
《智能路由器开发指南》——1.3 开源嵌入式操作系统比较
查看>>
程序员必须克服的十大编程禁忌
查看>>
unity的www.dispose()卡死freeze bug
查看>>
PostgreSQL 10.0 preview 功能增强 - libpq支持多主机连接(failover,LB)让数据库HA和应用配合更紧密...
查看>>
阿里云宣布CDN服务支持HTTP/2 访问速度最高可提升68%
查看>>
iOS开发中手势识别
查看>>
双十一 手淘技术用了这几招
查看>>
开放搜索相关性函数Distance:计算你我之间的距离
查看>>
最右App:青少年娱乐社区应用的云端架构演进之路
查看>>
数据库操作:MYSQL与MFC连接(二)
查看>>