- 浏览: 1111059 次
文章分类
- 全部博客 (379)
- S2SH (16)
- stuts2 (0)
- java语言 (81)
- JSP (17)
- <html>元素 (11)
- javaweb (4)
- web容器 (3)
- ext (23)
- javaScript (48)
- ant (1)
- liferay (1)
- sql (9)
- css (42)
- 浏览器设置 (3)
- office_world (1)
- eclipse (4)
- 其它 (28)
- 操作系统 (5)
- android (6)
- Struts2 (11)
- RegEx (3)
- mysql (5)
- BigDATA (1)
- Node.js (1)
- Algorithm (10)
- Apache Spark (1)
- 数据库 (5)
- linux (2)
- git (1)
- Adobe (3)
- java语言,WebSocket (1)
- Maven (3)
- SHELL (1)
- XML (2)
- 数学 (2)
- Python (2)
- Java_mysql (1)
- ReactJS (6)
- 养生 (4)
- Docker (1)
- Protocols (3)
- java8 (2)
- 书籍 (1)
- Gradle (2)
- AngularJS (5)
- SpringMVC (2)
- SOAP (1)
- BootstrapCSS (1)
- HTTP协议 (1)
- OAuth2 (1)
最新评论
-
Lixh1986:
Java并发编程:自己动手写一把可重入锁https://blo ...
Java之多线程之Lock与Condition -
Lixh1986:
http://win.51apps.com.cn/https: ...
temp -
ztwsl:
不错,支持很好
HttpServletRequest和ServletRequest的区别 -
guodongkai:
谢谢您能将知识精华汇编总结,让初学者们从原理中学会和提高。
javaScript之function定义 -
kangwen23:
谢谢了,顶顶
struts2中的ValueStack学习
一、背景知识:
由于 java 中 double 所表示的精度是有限的,而且对于小数的运算不够准确。
java 提供了 BigDecimal 类,专门用于数的准确计算。这一点可以满足金融行业的需求。
二、正式开始:
BigDecimal 可以操作任意精度位数的十进制数字。
1、BigDecimal 由两部分组成:[unscaled value, scale]
1. 不定规模的值(unscaled value):
该值是一个任意精度的整数(arbitrary precision integer)。
2. 规模(scale):
是一个32位的整数(integer)。 可以用以下任一种方法:
● 如果 规模(scale)的值是 0 或 正数: 规模(scale)的值代表 BigDecimal 小数点右侧数字的个数。
例如: [19,2] 所表示的值是: 0.19
● 如果 规模(scale)的值是 负数: 不定规模的值(unscaled value)乘以 10 的规模(scale)值的幂次方,得到 BigDecimal 真实值的大小。
例如: [19,-2] 所表示的值是: 19 * 10⁻² = 0.19
2、BigDecimal 提供的操作:
算数(加减乘除),规模控制,近似值,大小比较,哈希值,格式转换。
3、查看 BigDecimal 所表示的值:
toString(): 将 BigDecimal 所代表的值以字符串形式显示。如果有需要,会使用科学计数法显示。
toPlainString(): 将 BigDecimal 所代表的值以字符串形式显示。不用科学计数法显示。
4、对于求近似值:
如果一个数的小数部分是无限的(例如 1/3),而又没有指定取舍模式(rounding mode)(四舍五入、取整、等),则会抛出异常。
如果一个数是有限的,可以通过使用 MathContext 对象指定计算时使用的精度(precision)和取舍模式(rounding mode)。
5、对于取舍模式:
BigDecimal 类内部使用8个整型常量提供了8种取舍模式(如: ROUND_HALF_UP 四舍五入),但这种方法已被弃用。
请使用 RoundingMode 对象的常量属性。(如: RoundingMode.HALF_UP )
6、对于精度:
精度计算:
从运算结果的最左侧第一个不为0的数算起,直至末尾。
例如:
0.000042 的精度是 2
0.0000420 的精度是 3
精度的值(jdk 1.5 及之前的版本):
使用精度值为 0 (如: MathContext.UNLIMITED )的 MathContext 对象时,算数操作的结果是精确的。
这是因为算数操作没有使用这个 MathContext 对象。由于没有指定精度,在操作无限数时会抛出异常。例如:除法运算 1/3
使用精度值非0的 MathContext 对象时,算数的运算规则与 ANSI X3.274-1996 和 ANSI X3.274-1996/AM 1-2000 相兼容。
BigDecimal 类还包含了其它的取舍模式。如果这些规则与 ANSI 标准相冲突,BigDecimal 会使用自己制定的运算规则。
7、对于运算结果的表示:
使用算数运算和精度运算,对于运算结果的表示,必须指定数值结果(numerical result)和规模(scale)。
因为:同一个值,因规模(scale)的不同,结果的表示也不同。
8、通常用法:
如果运算结果的位数(可能是无限小数)大于需要的位数时,使用取舍模式和精度来共同决定运算结果如何返回。
首先:使用 MathContext 对象设置精度。
其次:使用 取舍模式决定要丢弃的尾部位数如何影响返回的结果。
当取舍模式运算结果有进位而影响了所指定的精度时,则进位会被保留。
如:对 999.9 做四舍五入,指定精度为 3位。返回值是:1000,此时输出结果为: 1.00 × 10³
9、算数操作的默认规模(scale)
加法操作(a+b): max(a.scale(), b.scale())
减法操作(a-b): max(a.scale(), b.scale())
乘法操作(a*b): a.scale() + b.scale()
除法操作(a/b): a.scale() - b.scale()
特别注意:
除法操作请指定规模,而不能使用默认的规模。
例如: 1/32 的结果是 0.03125
10、算数操作的规模(scale)
- 在对运算结果做取舍操作之前,逻辑中间运算结果的 scale 被默认设置为取舍运算的 scale。
- 如果运算结果是无限小数,则运算结果的scale是根据设定的精度做取舍运算后得到的 scale。
- 如果运算结果是有限数,则运算结果的scale会取值为最接近默认设置的 scale 。
除法运算会使运算结果的 scale 变小,例如:
scale 变小的情况: 19/100 = 0.19 // integer=19, scale=2
scale 不变的情况: 21/110 = 0.190 // integer=190, scale=3
注意:对于加法、减法、乘法,运算结果的 scale 的减小等于运算结果舍弃的位数。
如果取舍运算有进位的情况,运算结果的附加数字将被丢弃。
11、两种会影响规模(scale)的操作:
1. setScale()/round() 操作。返回 BigDecimal 类型。
2. 小数点移动操作( movePointLeft() / movePointRight() )。返回 BigDecimal 类型。
12、注意:
在使用具有大小排序功能的类时(如: SortedMap, SortedSet ),
BigDecimal 不能按照其所代表的值的真实大小排序。因为 BigDecimal 的 equals() 方法与 BigDecimal 值的大小不符。
13、讨论:
(一)精度(precision)与规模(scale)
(二)有进位的情况
(三)与 double 比较
-
引用:
https://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html
-
转载请注明
原文出处: http://lixh1986.iteye.com/blog/2323077
-
-
由于 java 中 double 所表示的精度是有限的,而且对于小数的运算不够准确。
java 提供了 BigDecimal 类,专门用于数的准确计算。这一点可以满足金融行业的需求。
二、正式开始:
BigDecimal 可以操作任意精度位数的十进制数字。
1、BigDecimal 由两部分组成:[unscaled value, scale]
1. 不定规模的值(unscaled value):
该值是一个任意精度的整数(arbitrary precision integer)。
2. 规模(scale):
是一个32位的整数(integer)。 可以用以下任一种方法:
● 如果 规模(scale)的值是 0 或 正数: 规模(scale)的值代表 BigDecimal 小数点右侧数字的个数。
例如: [19,2] 所表示的值是: 0.19
● 如果 规模(scale)的值是 负数: 不定规模的值(unscaled value)乘以 10 的规模(scale)值的幂次方,得到 BigDecimal 真实值的大小。
例如: [19,-2] 所表示的值是: 19 * 10⁻² = 0.19
2、BigDecimal 提供的操作:
算数(加减乘除),规模控制,近似值,大小比较,哈希值,格式转换。
3、查看 BigDecimal 所表示的值:
toString(): 将 BigDecimal 所代表的值以字符串形式显示。如果有需要,会使用科学计数法显示。
toPlainString(): 将 BigDecimal 所代表的值以字符串形式显示。不用科学计数法显示。
4、对于求近似值:
如果一个数的小数部分是无限的(例如 1/3),而又没有指定取舍模式(rounding mode)(四舍五入、取整、等),则会抛出异常。
如果一个数是有限的,可以通过使用 MathContext 对象指定计算时使用的精度(precision)和取舍模式(rounding mode)。
5、对于取舍模式:
BigDecimal 类内部使用8个整型常量提供了8种取舍模式(如: ROUND_HALF_UP 四舍五入),但这种方法已被弃用。
请使用 RoundingMode 对象的常量属性。(如: RoundingMode.HALF_UP )
6、对于精度:
精度计算:
从运算结果的最左侧第一个不为0的数算起,直至末尾。
例如:
0.000042 的精度是 2
0.0000420 的精度是 3
精度的值(jdk 1.5 及之前的版本):
使用精度值为 0 (如: MathContext.UNLIMITED )的 MathContext 对象时,算数操作的结果是精确的。
这是因为算数操作没有使用这个 MathContext 对象。由于没有指定精度,在操作无限数时会抛出异常。例如:除法运算 1/3
使用精度值非0的 MathContext 对象时,算数的运算规则与 ANSI X3.274-1996 和 ANSI X3.274-1996/AM 1-2000 相兼容。
BigDecimal 类还包含了其它的取舍模式。如果这些规则与 ANSI 标准相冲突,BigDecimal 会使用自己制定的运算规则。
7、对于运算结果的表示:
使用算数运算和精度运算,对于运算结果的表示,必须指定数值结果(numerical result)和规模(scale)。
因为:同一个值,因规模(scale)的不同,结果的表示也不同。
8、通常用法:
如果运算结果的位数(可能是无限小数)大于需要的位数时,使用取舍模式和精度来共同决定运算结果如何返回。
首先:使用 MathContext 对象设置精度。
其次:使用 取舍模式决定要丢弃的尾部位数如何影响返回的结果。
当取舍模式运算结果有进位而影响了所指定的精度时,则进位会被保留。
如:对 999.9 做四舍五入,指定精度为 3位。返回值是:1000,此时输出结果为: 1.00 × 10³
9、算数操作的默认规模(scale)
加法操作(a+b): max(a.scale(), b.scale())
减法操作(a-b): max(a.scale(), b.scale())
乘法操作(a*b): a.scale() + b.scale()
除法操作(a/b): a.scale() - b.scale()
特别注意:
除法操作请指定规模,而不能使用默认的规模。
例如: 1/32 的结果是 0.03125
10、算数操作的规模(scale)
- 在对运算结果做取舍操作之前,逻辑中间运算结果的 scale 被默认设置为取舍运算的 scale。
- 如果运算结果是无限小数,则运算结果的scale是根据设定的精度做取舍运算后得到的 scale。
- 如果运算结果是有限数,则运算结果的scale会取值为最接近默认设置的 scale 。
除法运算会使运算结果的 scale 变小,例如:
scale 变小的情况: 19/100 = 0.19 // integer=19, scale=2
scale 不变的情况: 21/110 = 0.190 // integer=190, scale=3
注意:对于加法、减法、乘法,运算结果的 scale 的减小等于运算结果舍弃的位数。
如果取舍运算有进位的情况,运算结果的附加数字将被丢弃。
11、两种会影响规模(scale)的操作:
1. setScale()/round() 操作。返回 BigDecimal 类型。
2. 小数点移动操作( movePointLeft() / movePointRight() )。返回 BigDecimal 类型。
12、注意:
在使用具有大小排序功能的类时(如: SortedMap, SortedSet ),
BigDecimal 不能按照其所代表的值的真实大小排序。因为 BigDecimal 的 equals() 方法与 BigDecimal 值的大小不符。
13、讨论:
(一)精度(precision)与规模(scale)
BigDecimal b1 = new BigDecimal("35.3456").round(new MathContext(4, RoundingMode.HALF_UP)); System.out.println(b1.toString()); //result = 35.35 BigDecimal b2 = new BigDecimal("35.3456").setScale(4, RoundingMode.HALF_UP); System.out.println(b2.toString()); // result = 35.3456
(二)有进位的情况
BigDecimal b3 = new BigDecimal("999.9").round(new MathContext(3, RoundingMode.HALF_UP)); System.out.println(b3.toString()); // 1.00E+3 System.out.println(b3.toPlainString()); // 1000 System.out.println(b3.precision()); // 3 BigDecimal b4 = new BigDecimal("2000"); System.out.println(b4.toString()); // 2000
(三)与 double 比较
double a = 0.02; double b = 0.03; double c = b - a; System.out.println(c); // 0.009999999999999998 BigDecimal _a = new BigDecimal("0.02"); BigDecimal _b = new BigDecimal("0.03"); BigDecimal _c = _b.subtract(_a); System.out.println(_c); // 0.01
-
引用:
https://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html
-
转载请注明
原文出处: http://lixh1986.iteye.com/blog/2323077
-
-
发表评论
-
java 将文件夹所有的文件合并到指定的文件夹下
2020-06-30 19:17 1055场景:将文件夹所有的文件合并到指定的文件夹下 另外:如果想效 ... -
多线程-线程池的四种创建方式
2020-04-01 18:38 481多线程-线程池的四种创建方式 https://blog.cs ... -
Java基础之:nio
2019-11-13 15:38 477一、理论讲解: 史上最强Java NIO入门:担心从入门到放弃 ... -
Java 分布式之:RPC 基本概念
2019-11-13 15:07 454转载: https://www.jianshu.com/p/ ... -
Java之 volatile 关键字原理详解
2019-11-07 15:36 543一、什么是 volatile ? ... -
POI实现excell批注背景图片(仿html浮窗显示图片)
2019-10-21 08:17 682POI实现excell批注背景图片(仿html浮窗显示图片) ... -
Java之设计模式之 Observer 观察者
2019-07-04 17:21 1063观察者设计模式 Java 已经实现了该模式,并且提供了使用类 ... -
HashMap, LinkedHashMap and TreeMap
2019-03-01 11:04 673https://stackoverflow.com/a/177 ... -
Java lib 操作 excel 插入图片
2019-01-19 12:46 879https://poi.apache.org/componen ... -
数据库连接池C3P0
2018-05-29 16:50 890一、名字的由来 很多 ... -
Java8之集合(Collection)遍历 forEach()、stream()
2018-05-29 14:39 20744package java8.collections; ... -
Junit Vs main on "java.util.concurrent.Executors"
2017-11-10 16:44 808Same code with different result ... -
Java之大数据学习路线
2017-11-03 10:08 5720三个月大数据研发学习 ... -
Java中创建对象的5种方式
2017-10-26 14:21 839一、Java之5种创建对象的方式 ————————————— ... -
Log4j和Slf4j的比较
2017-06-23 12:41 1406一直搞不清 Log4j 和 SLF4j 的关系。今天才若有所 ... -
Java之Java7新特性之try资源句式
2017-04-20 14:58 5384Java之Java7新特性之try资源句式 一、【try资源 ... -
Java之 java.util.concurrent 包之ExecutorService之submit () 之 Future
2017-03-04 21:27 3834一、如何使用 ExecutorService.submit() ... -
Java之 java.util.concurrent 包之Executor与ExecutorService
2017-03-04 21:18 2702一、问题: execute() 与 submit() 的区别? ... -
JAVAEE之单用户登录
2017-02-05 11:55 1058单用户登录是系统中数据一直性的解决方案之一。 问题背景: 试 ... -
Java之多线程之线程池之线程重复使用
2017-02-04 13:33 5565一、问题背景 在使用多线程时,如果要开启一个任务,则就需要新 ...
相关推荐
在Java编程语言中,BigDecimal是用于处理高精度和可配置精度的十进制数的类。在进行商业计算时,由于浮点数(double和float)存在精度问题,不能保证准确的结果,因此通常推荐使用BigDecimal来确保计算的精确性。本文...
总的来说,理解和熟练运用BigDecimal是每个Java开发者必备的技能之一,特别是在处理货币计算、财务计算等场景时,能够避免因为浮点数精度问题导致的错误。在使用BigDecimal时,一定要注意其性能开销,因为它比基本的...
Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE...
在Java编程中,当涉及到需要精确数值计算的场景时,我们通常会使用`BigDecimal`类。这是因为`float`和`double`类型虽然适用于科学计算和工程计算,但它们基于二进制浮点运算,不能保证完全精确的结果。而`BigDecimal...
Java中的`BigDecimal`类是用于表示和操作高精度浮点数的重要工具,尤其适用于需要进行精确计算的场景,如财务和货币计算。由于基本数据类型`double`和`float`在进行大数值或高精度计算时可能会导致精度丢失,因此`...
Java编程BigDecimal用法实例分享 Java中的BigDecimal类是Java标准库中的一部分,用于处理高精度的数字计算,特别是在商业计算中对数字精度要求较高的场景中。BigDecimal类提供了对大数字的操作,可以精确地计算货币...
Java中BigDecimal类的使用详解 Java中BigDecimal类是Java.math包中提供的一个API类,用于对超过16位有效位的数进行精确的运算。由于浮点数的精度问题,Java中浮点数的计算会失去一定的精确度。因此,使用BigDecimal...
在Java编程语言中,`BigInteger`和`BigDecimal`是两个重要的类,它们分别用于处理大整数和高精度浮点数。这两个类位于`java.math`包下,为开发者提供了超越基本数据类型(如int、long和double)的计算能力。在深入...
Java中BigDecimal的基本运算详解 Java中的BigDecimal是一种高精度的数据类型,它可以用来表示非常大的整数和小数,提供了丰富的数学运算功能。下面我们将对Java中BigDecimal的基本运算进行详细的介绍。 构造方法 ...
JAVA基础:java.math.BigDecimal的使用方法. JAVA基础:java.math.BigDecimal的使用方法.
因此,理解并熟练运用BigDecimal类是每个Java程序员必备的技能之一。在编写涉及精确数值计算的代码时,应优先考虑使用BigDecimal,以避免因浮点数不精确而导致的问题。同时,需要注意的是,BigDecimal的操作相对于...
Java 中 BigDecimal 的常用方法归类(加减乘除) Java 中的 BigDecimal 类提供了对浮点数的精确运算,包括加减乘除和四舍五入等操作。在 Java 中,简单类型不能够精确地对浮点数进行运算,因此需要使用 BigDecimal ...
"Java使用BigDecimal进行运算封装的实际案例" 今天,我们将讨论Java中使用BigDecimal进行运算封装的实际案例。BigDecimal是Java中一个用于处理精确数字计算的类,它提供了多种数学运算方法,如加法、减法、乘法、除...
java.math.BigDecimal 操作类,包含加减乘除、String型加减乘除精度格式化转换计算等
Java Bigdecimal使用原理详解 Java Bigdecimal是Java语言中用于精确计算的类,它可以完善float和double类无法进行精确计算的缺憾。BigDecimal类位于java.math类包下,提供了多种构造函数和方法来实现精确计算。 ...
复杂的BigDecimal计算,需要开方的式子,可输入结果精确位数
Java中的`BigDecimal`类是用来表示任意精度的十进制数,尤其适合于需要精确计算的商业和财务场景。它的核心概念包括非标度值(unscaled value)和标度(scale),非标度值是一个任意精度的整数,标度则是小数点后的...
BigDecimal 类是 Java 中的一种数值类型,主要用于处理超过 16 位有效数字的数值运算。该类提供了多种构造器和方法,用于创建和操作 BigDecimal 对象。 构造器 BigDecimal 类提供了四种构造器,用于创建不同的 ...
BigDecimal工具类是Java中用于高精确处理常用数学运算的工具类。该工具类提供了多种精确的数学运算方法,包括加法、减法、乘法和除法等。 在BigDecimal工具类中,我们可以看到多个重载的方法,例如add方法和sub方法...
相比之下,使用 `BigDecimal(String)` 构造函数创建 `new BigDecimal("0.1")` 将得到预期的0.1。当从 `double` 转换为 `BigDecimal` 时,建议使用 `BigDecimal.valueOf(double)` 方法,它会提供准确的转换。 ### ...