BigDecimal

float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合。但是,商业计算往往要求结果精确,这时候BigDecimal就派上大用场了。

如下是BigDecimal提供的加减乘除方法。

public BigDecimal add(BigDecimal value); //加法

public BigDecimal subtract(BigDecimal value); //减法

public BigDecimal multiply(BigDecimal value); //乘法

public BigDecimal divide(BigDecimal value); //除法

这个类是Java里精确计算的类,下面说一下两个BigDecimal对象大小,相等的判断。

1. 比较对象是否相等

将String表示形式转换成BigDecimal,举个例子:

BigDecimal a = BigDecimal.valueOf("1.0");

BigDecimal b = BigDecimal.valueOf("1.000");

在现实中这两个数字是相等的,但是如果用a.equals(b) 或 a==b 结果都返回false。

结果是false。

怎么会不相等了呢?

2. 首先看一下BigDecimal的equals()方法

可以看到BigDecimal的euquals方法是先判断要比较的数据类型,如果对象类型一致前提下同时判断精确度(scale)和值(BigInteger的equals方法)是否一致。

其实javadoc里面就已经写的很明白:

Compares this BigDecimal with the specified Object for equality. Unlike compareTo, this method considers two BigDecimal objects equal only if they are equal in value and scale (thus 2.0 is not equal to 2.00 when compared by this method).

因此,a.equals(b) 方法返回false,是因为精度不一致。

而等于比较符(a==b)是比较内存地址,“1.0”和“1.000”二者内容当然不一样了,并且是2个不同的对象,内存地址也不一样。

3. 再看看compareTo() 方法

if(a.compareTo(b) == 0)结果是true。

javadoc文档中内容:

Compares this {@code BigDecimal} with the specified

* {@code BigDecimal}. Two {@code BigDecimal} objects that are

* equal in value but have a different scale (like 2.0 and 2.00)

* are considered equal by this method.

说明:public int compareTo(BigDecimal val)

将此BigDecimal与指定的BigDecimal进行比较。

两个BigDecimal对象的价值相等但具有不同的精度(如1.0和1.000)被认为是相等的这种方法。

compareTo 定义在Comparable

参数:val - BigDecimal要与此BigDecimal进行比较。

返回:-1,0或1,因为BigDecimal数值小于等于或大于val。

最后结论是:对于BigDecimal的大小比较,用equals方法的话会不仅会比较值的大小,还会比较两个对象的精确度,而compareTo方法则不会比较精确度,只比较数值的大小。

bigdecimal乘法_Java面试题之BigDecimal比较大小问题相关推荐

  1. bigdecimal乘法_Java BigDecimal乘法()方法与示例

    bigdecimal乘法 BigDecimal类的multiple()方法 (BigDecimal Class multiply() method) Syntax: 句法: public BigDec ...

  2. java bigdecimal乘法_Java BigDecimal类型的 加减乘除运算

    加法:add 减法:subtract 乘法:multiply 除法:divide 可参考下面代码: BigDecimal bignum1 = new BigDecimal("10" ...

  3. java bigdecimal赋值_Java中BigDecimal类介绍及用法(亲测)

    Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高精度计算. 其中 BigInteger 类是 ...

  4. bigdecimal正确用法_深入理解 BigDecimal 的使用

    什么是 BigDecimal BigDecimal 可以表示一个任意大小且精度完全准确的浮点数. 为什么用 BigDecimal 而不用 double Talk is cheap, Show me t ...

  5. BigDecimal加减乘(cheng)除BigDecimal[]数组比较大小

    文章目录 前言 一.Bigdecimal是什么? 二.使用步骤 总结 前言 提示:BigDecimal 在使用的过程中尽量采用String类型的参数进行转换尽量避免不使用字符串的数字对小数点进行数据格 ...

  6. BigDecimal的加减乘除,以及四舍五入和比较大小

    加法:add()函数 减法:subtract()函数 乘法:multipy()函数 除法:divide()函数 首先进行初始化 这里对比了两种形式,第一种直接value写数字的值,第二种用string ...

  7. postgresql Monetary Types to BigDecimal ,error - Bad value for type BigDecimal : 2,500.00

    postgresql  Monetary Types to BigDecimal ,error -> Bad value for type BigDecimal : 2,500.00 因为从数据 ...

  8. Java实现大数乘法_java实现大数加法、乘法(BigDecimal)

    之前写过用vector.string实现大数加法,现在用java的BigDecimal类,代码简单很多.但是在online-judge上,java的代码运行时间和内存大得多. java大数加法:求a+ ...

  9. java bigdecimal语法_JAVA BigDecimal 小数点处理

    语法:// 返回小数点后位数 BigDecimal.setScale(); // setScale len参数指定小数点后位数 BigDecimal.setScale(len); PS: setSca ...

最新文章

  1. void关键字的使用规则
  2. vscode从原有分支上新建_GitHub+VSCode 打造稳定、快速、高效、免费图床
  3. python第四篇:linux命令行总结 + 自动备份Python程序
  4. stm32串口学习(二)
  5. 【LeetCode】6.Z 字形变换
  6. BitcoinCore JSONRPC Java使用,创建账号,获取余额,转账等等...
  7. 我10年来的学习和生活
  8. I.MX6 gpio-keys driver hacking
  9. PartyUs 待添加内容(不定期更新)
  10. fftw3 嵌入式linux安装,Ubuntu18.04下快速的安装UHD与GnuRadio并连接USRP设备
  11. USACO 2.3 Cow Pedigrees 【DP+前缀和优化】
  12. svn汉化包安装后无效果
  13. 如何导出久其报表所有数据_【久其报表数据管理系统怎么用】久其报表数据管理系统好不好_使用技巧-ZOL软件百科...
  14. Spring:Spring支持的bean作用域有哪些
  15. 猜年龄、猜数字的python程序
  16. 数据处理第3部分:选择行的基本和高级的方法
  17. JS JavaScript 实现文字上下滚动效果
  18. 关于按键精灵url的post方法返回值为空
  19. php电商订单模块设计,电商后台订单管理模块
  20. 成功安装fbprophet(没有坑也没有眼泪,世上最详细步骤)

热门文章

  1. CSRF verification failed. Request aborted.的解决办法
  2. linux进程属性,Linux进程属性及含义
  3. 重庆理工大学图像处理实验三:图像分割
  4. zookeeper安装_Centos7安装配置Zookeeper
  5. Springboot 5.Springboot 返回cookies信息的post接口开发
  6. MongoDB CRUD命令操作
  7. SetWindowsHookEx 其他进程的 记录
  8. loadRunner函数之lr_set_debug_message
  9. 2014.4.21 福州 晴 离京第一次面试(某天) 失败啊
  10. linux-32bit-内存管理