- 浏览: 1091818 次
文章分类
- 全部博客 (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 979场景:将文件夹所有的文件合并到指定的文件夹下 另外:如果想效 ... -
多线程-线程池的四种创建方式
2020-04-01 18:38 414多线程-线程池的四种创建方式 https://blog.cs ... -
Java基础之:nio
2019-11-13 15:38 416一、理论讲解: 史上最强Java NIO入门:担心从入门到放弃 ... -
Java 分布式之:RPC 基本概念
2019-11-13 15:07 402转载: https://www.jianshu.com/p/ ... -
Java之 volatile 关键字原理详解
2019-11-07 15:36 445一、什么是 volatile ? ... -
POI实现excell批注背景图片(仿html浮窗显示图片)
2019-10-21 08:17 604POI实现excell批注背景图片(仿html浮窗显示图片) ... -
Java之设计模式之 Observer 观察者
2019-07-04 17:21 974观察者设计模式 Java 已经实现了该模式,并且提供了使用类 ... -
HashMap, LinkedHashMap and TreeMap
2019-03-01 11:04 628https://stackoverflow.com/a/177 ... -
Java lib 操作 excel 插入图片
2019-01-19 12:46 839https://poi.apache.org/componen ... -
数据库连接池C3P0
2018-05-29 16:50 813一、名字的由来 很多 ... -
Java8之集合(Collection)遍历 forEach()、stream()
2018-05-29 14:39 20662package java8.collections; ... -
Junit Vs main on "java.util.concurrent.Executors"
2017-11-10 16:44 734Same code with different result ... -
Java之大数据学习路线
2017-11-03 10:08 5674三个月大数据研发学习 ... -
Java中创建对象的5种方式
2017-10-26 14:21 809一、Java之5种创建对象的方式 ————————————— ... -
Log4j和Slf4j的比较
2017-06-23 12:41 1365一直搞不清 Log4j 和 SLF4j 的关系。今天才若有所 ... -
Java之Java7新特性之try资源句式
2017-04-20 14:58 5341Java之Java7新特性之try资源句式 一、【try资源 ... -
Java之 java.util.concurrent 包之ExecutorService之submit () 之 Future
2017-03-04 21:27 3774一、如何使用 ExecutorService.submit() ... -
Java之 java.util.concurrent 包之Executor与ExecutorService
2017-03-04 21:18 2646一、问题: execute() 与 submit() 的区别? ... -
JAVAEE之单用户登录
2017-02-05 11:55 1032单用户登录是系统中数据一直性的解决方案之一。 问题背景: 试 ... -
Java之多线程之线程池之线程重复使用
2017-02-04 13:33 5523一、问题背景 在使用多线程时,如果要开启一个任务,则就需要新 ...
相关推荐
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...
NULL 博文链接:https://ollevere.iteye.com/blog/1528655
BigInteger.java BigDecimal.java 文件 源代码
关于java中BigDecimal的简介(csdn)————程序
主要介绍了Java编程BigDecimal用法实例分享,具有一定参考价值,需要的朋友可以了解下。
主要介绍了java中BigDecimal的操作方法,较为详细的分析了BigDecimal类在进行商业计算时的应用方法,精度以及注意事项等问题,需要的朋友可以参考下
主要介绍了Java中BigDecimal类的简单用法,是Java应用程序开发中非常实用的技巧,本文以实例形式对此进行了简单的分析,需要的朋友可以参考下
对于不需要任何准确计算精度的数字可以直接使用float或double,但是如果需要精确计算的结果,则必须使用BigDecimal类,而且使用BigDecimal类也可以进行大数的操作,下面这篇文章给大家介绍了Java中BigDecimal的加减...
JAVA基础:java.math.BigDecimal的使用方法. JAVA基础:java.math.BigDecimal的使用方法.
主要介绍了Java中BigDecimal类的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
java.math.BigDecimal 操作类,包含加减乘除、String型加减乘除精度格式化转换计算等
下面小编就为大家带来一篇Java中BigDecimal的基本运算(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Java对BigDecimal常用方法的归类(加减乘除).doc
主要介绍了浅谈java中BigDecimal类的简单用法,在开发时,如果我们需要精确计算的结果,必须使用BigDecimal类来操作。感兴趣的话可以了解一下
今天小编就为大家分享一篇关于Java使用BigDecimal进行运算封装的实际案例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
解决mongo数据插入时 报错问题 mogodb插入数据时报错Can't find a codec for class java.math.BigDecimal
Java中BigInteger的数学运算,BigDecimal 加减乘除运算,Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大...
之前写过用vector、string实现大数加法,现在用java的BigDecimal类,代码简单很多。但是在online-judge上,java的代码运行时间和内存大得多
javascript的数值精确计算类bigdecimal,改编自java的bigdecimal
借用《Effactive Java》这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供...