- 浏览: 367196 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
xujishen:
新入职 写道还是没很明白~~这个BigDecimal.ROUN ...
BigDecimal带精度的运算 -
542348257:
数字为long型的时候 好像处理有点问题
【无聊的笔记】将数字转换为中文读法 -
陈小妞:
当你输入100003980的时候在万位会多一个万字
【无聊的笔记】将数字转换为中文读法 -
stranger520:
可能有问题吧,举个例子: pacage1/User.class ...
java读取指定package下的所有class -
springdata_springmvc:
java程序语言学习教程 地址http://www.zuida ...
java学习——mina篇
之前提到过在商业运算中要使用BigDecimal来进行相关的钱的运算(java中关于浮点运算需要注意的 ),可是实际使用中,简单的用BigDecimal还是出现了一些小问题。
BigDecimal a = new BigDecimal(998.01); BigDecimal b=new BigDecimal("100"); System.out.println(a.multiply(b)); BigDecimal aa = new BigDecimal(135.95); BigDecimal bb=new BigDecimal("100"); System.out.println(aa.multiply(bb)); BigDecimal test = new BigDecimal(4.015); BigDecimal test1 = new BigDecimal(100); System.out.println(test.multiply(test1));
输出结果为:
99800.999999999999090505298227071762084960937500 13594.99999999999886313162278383970260620117187500 401.49999999999996802557689079549163579940795898437500
出现这种情况的原因就是没有使用BigDecimal的精度。不罗嗦了,直接写上使用BigDecimal的带精度的运算。
比较简单,看代码:
BigDecimal aa = new BigDecimal(135.95); BigDecimal bb=new BigDecimal("100"); BigDecimal result=aa.multiply(bb); System.out.println(result.setScale(2,BigDecimal.ROUND_HALF_EVEN));
此时的输出结果为:
13595.00
最主要的是运用了:
result.setScale(2,BigDecimal.ROUND_HALF_EVEN)
看一下BigDecimal的setScale的api
setScale public BigDecimal setScale(int newScale, int roundingMode) 返回一个 BigDecimal,其标度为指定值,其非标度值通过此 BigDecimal 的非标度值乘以或除以十的适当次幂来确定, 以维护其总值。如果该操作减少标度,则非标度值必须被除(而不是乘),并且该值可以更改;在这种情况下,将指定的 舍入模式应用到除法中。 注意,由于 BigDecimal 对象是不可变的,此方法的调用不会 导致初始对象被修改, 这与使用名为 setX 变异字段 X 方法的常规约定相反。相反,setScale 返回具有适当标度的对象; 返回的对象不一定是新分配的。 相对于此遗留方法,应优先使用新的 setScale(int, RoundingMode) 方法。 参数: newScale - 要返回的 BigDecimal 值的标度。 roundingMode - 要应用的舍入模式。 返回: 一个 BigDecimal,其标度为指定值,其非标度值可以通过此 BigDecimal 的非标度值乘以或除以十的适当次幂来确定。
RoundingMode的API
枚举常量摘要
CEILING
向正无限大方向舍入的舍入模式。
DOWN
向零方向舍入的舍入模式。
FLOOR
向负无限大方向舍入的舍入模式。
HALF_DOWN
向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向下舍入。
HALF_EVEN
向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
HALF_UP
向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向上舍入。
UNNECESSARY
用于断言请求的操作具有精确结果的舍入模式,因此不需要舍入。
UP
远离零方向舍入的舍入模式。
看完这些前面那个:
result.setScale(2,BigDecimal.ROUND_HALF_EVEN)
的意思就是,将这个BigDecimal小数点后保留2位,四舍五入的方式为向最接近数字方向舍入的舍入 模式,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
ok,记录完毕,看来以后要用bigDecimal还必须要用它这个scale的功能来保证精度,不然还是跟double一样会出现悲剧!
评论
----------
even的意思就是 四舍六如 逢 五 上双: .4 以下肯定舍, .6 以上肯定入. .5 往偶数那个方向舍入.
所以 3.5 和 4.5 都会舍入到 偶数 4 上面!
这样用double 构造BigDecimal是不精确的,因为double在计算机的表示本身就是不精确的。其实在java文档里的这个构造方法也提到:
Notes:
The results of this constructor can be somewhat unpredictable. One might assume that writing new BigDecimal(0.1) in Java creates a BigDecimal which is exactly equal to 0.1 (an unscaled value of 1, with a scale of 1), but it is actually equal to 0.1000000000000000055511151231257827021181583404541015625. This is because 0.1 cannot be represented exactly as a double (or, for that matter, as a binary fraction of any finite length). Thus, the value that is being passed in to the constructor is not exactly equal to 0.1, appearances notwithstanding.
The String constructor, on the other hand, is perfectly predictable: writing new BigDecimal("0.1") creates a BigDecimal which is exactly equal to 0.1, as one would expect. Therefore, it is generally recommended that the String constructor be used in preference to this one.
When a double must be used as a source for a BigDecimal, note that this constructor provides an exact conversion; it does not give the same result as converting the double to a String using the Double.toString(double) method and then using the BigDecimal(String) constructor. To get that result, use the static valueOf(double) method.
所以应该用string去构造浮点数。
BigDecimal a = new BigDecimal("998.01");
BigDecimal b=new BigDecimal("100");
System.out.println(a.multiply(b));
这样的结果就是99801.00。
当然我们仍然可以设定精度,特别是在除法的情况下。
发表评论
-
2013年技术愿望目标
2013-01-07 23:25 0一: 读源码 1:jetty 2:webx,spr ... -
jetty的http协议解析
2012-07-31 23:59 0上篇文章讲到:jetty的connection解析到hand ... -
jetty源码阅读之connection解析到handler调用
2012-07-29 21:58 0前言: 想要处理用户发出的http请求,首先得获得连接 ... -
jetty源码阅读之connector
2012-07-29 14:56 0AbstractConnector @Overr ... -
定时执行Timer的源码阅读
2012-02-22 18:51 1658Timer的实现原理: 1:timer简介; ... -
jetty翻译
2011-09-06 23:50 0异步等待 异 ... -
【转】mysql Host is blocked error错误解决方案
2011-08-01 14:40 2834Host is blocked because of ma ... -
java按值传递
2011-06-28 23:13 0来看看代码 packag ... -
【无聊的笔记】将数字转换为中文读法
2011-06-05 15:43 6212将阿拉伯数字的数变成我们常用的中文读法, 比如说: 1 ... -
用mina网络传输使用ObjectSerializationCodecFactory一个小注意点
2011-04-05 18:18 8655背景: 之前的 一篇介绍mina的博客中,提到通过mi ... -
jboss下的war包的context映射配置
2011-02-10 17:19 0一般web容器都可以在 deploy 目录下放多个war包, ... -
maven war plugin 的filter 配置。
2011-02-10 17:14 0具体可以参考,maven的官方配置。 http://m ... -
【why系列】内部类为什么访问外围内需要用final
2011-01-10 13:16 011111111111111 -
java命令行知多少(反正我知道的比较少)
2010-12-29 17:11 3807打开 %java_home%\bin 下面,看一堆的命令 ... -
【why系列】为什么序列化要实现一个空接口Serializable
2010-12-25 22:16 0啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 -
【why系列】为什么说java是不可变的对象
2010-12-25 22:15 0啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 package ... -
java线程总结
2010-12-23 15:25 01:java启动一个线程,会为每一个线程,分配一个 ... -
【监控】通过jmx获得系统的gc,内存情况
2010-11-27 21:52 6164通过jmx访问jvm知道的Mbean的一些信息,可以取得系统运 ... -
自动动手写原生态jmx,MbeanInfo,invoke
2010-11-16 22:07 1964使用jmx的东东主要包括下面几个步骤了: 发布j ... -
用spring连接jmx
2010-11-14 18:20 1776接着上一篇 “原生态连接jmx”的例子。 上一篇中,发 ...
相关推荐
Java中BigInteger的数学运算,BigDecimal 加减乘除运算,Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大...
高精度JSBigDecimal运算,解决JS中BigDecimal运算和精度问题。
DecimalFormat精度解决,商业运算精度问题,BigDecimal类的应用--------------
大精度的数学运算,通过BigDecimal来实现了加、减、乘、除与四舍五入运算。
是不是还在为多精度小数运算烦恼 这个满足你一切要求 项目中需要对金钱进行运算,为了使计算结果更准确,故使用bigDecimal工具来实现
众所周知,数字运算的精度问题是一个让人很旦疼的问题,而java中有BigDecimal类对数字精度问题进行处理,经过一番查询,发现前段有一个宝藏精度处理类bignumber。亲测好用。 众所周知,数字运算的精度问题是一个让人...
//BigDecimal ⾼精度⼩数运算 BigDecimal b3=new BigDecimal("0.09"); BigDecimal b4=new BigDecimal("0.01"); //加法 System.out.println(b3.add(b4)); //减法 System.out.println(b3.subtract(b4)); //乘法 ...
理解BigDecimal类的使用,并了解如何处理大数精度计算和避免精度丢失。 掌握Math类提供的各种数学计算方法,如三角函数、指数运算等。 学习Random类的使用,包括生成随机数和调整范围。 理解DecimalFormat类的功能,...
JavaScript解决高精度数字运算。
在前端实际开发中,进行前端计算会出现丢失精度的问题,项目中需要对金钱进行运算,为了使计算结果更准确,故使用bigDecimal工具来实现
JS小数加减乘除运算后小数点后产生多位数和计算精度损失的解决方案
实现带括号的简单计算器,能够进行10000位的运算,支持大整数开方。不过,点击关闭窗口按钮时有时候不能关闭,请大家帮忙看看,另外,大数开方是用c++封装的dll。
ArithmeticUtils用于高精确处理常用的数学运算工具类 提供精确的加法运算 提供精确的减法运算 ...当发生除不尽的情况时,由scale参数指定精度,以后的数字四舍五入 提供精确的小数位四舍五入处理 取余数 比较大小
在BigDecimal中,所有的算术运算都被实现,包括对数,线性方程组的系统解析度,三角函数,多项式回归,双曲函数,臭名昭著的伽马函数(非整数实数的阶乘)以及将继续实现的更多函数。 我的意图是至少实现Windows...
要保证精度就要使用BigDecimal类,而且不能直接从double直接转BigDecimal,要将double转string再转BigDecimal。也就是不能使用BigDecimal(double val) 方法,你会发现没有效果。要使用BigDecimal(String val) 方法...
//精度为2,舍入模式为大于0.5进1,否则舍弃 BigDecimal b1 = new BigDecimal(Double.toString(value1.doubleValue())); BigDecimal b2 = new BigDecimal(Double.toString(value2.doubleValue())); return b1....
Singulink.Numerics.BigDecimal BigDecimal是功能齐全的十进制类型,支持任意大的精度值。 它具有您希望从完整实现中获得的所有数学运算符,字符串转换和解析功能(具有完整的NumberStyles支持),并且针对所有大小...
无符号的bigint高精度大整数类,包含基本比较和运算,支持流式输入输出!
大家应该对于不需要任何准确计算精度的数字可以直接使用float或double运算,但是如果需要精确计算的结果,则必须使用BigDecimal类,而且使用BigDecimal类也可以进行大数的操作。下面这篇文章就给大家介绍介绍关于...
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做...