bigdecimal怎么转double呢?不知道的小伙伴来看看小编今天的分享吧!
在数据库中字段的类型为decimal(数字,数字),在JSP程序中要把它转换成double型的方法是:
((java.math.BigDecimal)row.get("数据库中字段")).doubleValue()
注意:row是Map的对象。row.get("数据库中字段")得到的类型是Object,要先转换成与数据库类型相对应的decimal后,再转换成double。
拓展资料:
BigDecimal
一、简介
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。
二、构造器描述
BigDecimal(int) 创建一个具有参数所指定整数值的对象。
BigDecimal(double) 创建一个具有参数所指定双精度值的对象。
BigDecimal(long) 创建一个具有参数所指定长整数值的对象。
BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象。
三、方法描述
add(BigDecimal) BigDecimal对象中的值相加,然后返回这个对象。
subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。
multiply(BigDecimal) BigDecimal对象中的值相乘,然后返回这个对象。
divide(BigDecimal) BigDecimal对象中的值相除,然后返回这个对象。
toString() 将BigDecimal对象的数值转换成字符串。
doubleValue() 将BigDecimal对象中的值以双精度数返回。
floatValue() 将BigDecimal对象中的值以单精度数返回。
longValue() 将BigDecimal对象中的值以长整数返回。
intValue() 将BigDecimal对象中的值以整数返回。
以上就是小编今天的分享了,希望可以帮助到大家。
为什么float和double运算会丢失精度?BigDecimal就一定靠谱?
先讨论一下float和double运算丢失精度问题
在java开发中,你也许会遇到浮点数时会丢失精度,那么先看看例子。
double a=3.00;double b=2.10;double c=a-b;System.out.println("c=" c);c=0.8999999999999999float e=3.00f;float f=2.10f;float g=e-f;System.out.println("g=" g);g=0.9000001
显然这结果都不是我们想要的。为什么浮点型运算为什么会造成精度丢失?在计算机中,保存这个数使用的是浮点表示法,分为三大部分:
比如float类型是32位,是单精度浮点表示法:
而double类型是64位,是双精度浮点表示法:
注意:
1.BigDecimal(double) 创建一个具有参数所指定双精度值的对象
但是这种类型是都不推荐使用的,为什么不推荐使用,我们来试一下
BigDecimal bigDecimal = new BigDecimal(0.2); System.out.println(bigDecimal);
当你写出这段代码的时候,感觉没啥问题,当输出出来的时候,就懵了。
0.200000000000000011102230246251565404236316680908203125
又出现精度问题了?其实当你在点击到这个方法看源码的时候,注释都提醒你慎重了。
* The results of this constructor can be somewhat unpredictable. 这个构造函数可以有些不可预测的结果 * One might assume that writing {@code new BigDecimal(0.1)} in * Java creates a {@code 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 * {@code double} (or, for that matter, as a binary fraction of * any finite length). Thus, the value that is being passed * <i>in</i> to the constructor is not exactly equal to 0.1, * appearances notwithstanding.
翻译过来:
* 此构造函数的结果可能有些不可预测。 这个构造函数可以是偶然不可预测的结果 * 人们可能会假设将 {@code new BigDecimal(0.1)} 写在 * Java 创建一个 {@code BigDecimal},它完全等于 * 0.1(未缩放的值为 1,缩放为 1),但它是 * 实际上等于 * 0.1000000000000000055511151231257827021181583404541015625。 * 这是因为 0.1 不能完全表示为 * {@code double}(或者,就此而言,作为 * 任何有限长度)。 因此,正在传递的值 * <i>in</i> 到构造函数不完全等于 0.1, * 外观除外。
意思是BigDecimal bigDecimal = new BigDecimal(0.2);这种初始化方式其实是用 double 数据类型去初始化这个 bigDecimal ,在转double时已经丢失精度。
既然不推荐使用 BigDecimal(double)。那么推荐使用什么呢?
BigDecimal(string) 或者使用 valueof
BigDecimal bigDecimal = new BigDecimal("0.2");System.out.println(bigDecimal);BigDecimal bigDecimal1 = BigDecimal.valueOf(0.2);System.out.println(bigDecimal1);
这时候,我们再来看看是否和我们预期的结果是一样的。
0.20.2
这两个实际上都是一个,valueof 只不过是在源码中帮我们把 double 给变换成了 Double.toString(val) ,也就是还是string。
这就是为什么有些面试官在面试基础的时候,很多次会问,float 和 double 都会丢失精度,BigDecimal 会丢失精度么?为什么?
你如果回答不会丢失精度,那恭喜你,你凉了,如果你回答会丢失精度,那么面试官肯定会追问到什么情况会丢失精度,什么情况不会丢失精度。
这也是为什么在 Effective Java 和 Mysql 必会内容 书中都会提到这块内容,如果你是一个几年工作经验的人,就不会有这种错误,但是你初入职场,经验没那么多,基础没那么牢固的肯定会发生这种事,赶快去检查一下你们公司的代码吧。
BigDecimal 的加减乘除加法:add
减法:subtract
乘法:multiply
除法:divide
BigDecimal保留小数点问题ROUND_DOWN :向零方向舍入
ROUND_UP :向远离0的方向舍入
ROUND_CEILING:向正无穷方向舍入
ROUND_FLOOR :向负无穷方向舍入
ROUND_HALF_DOWN:相当于五舍六入
ROUND_HALF_UP:相当于四舍五入(经常使用)