java数字转换bigdeciaml_BigDecimal的数据转换-java计算数
据(1)
Bigdecimal 数据转换精度缺失
使⽤ new BigDecimal()、.valueof() 和 new BigDecimal("[字符串]")的区别
构造 BigDecimal 对象常⽤以下⽅法:
BigDecimal BigDecimal(double d); //不允许使⽤
BigDecimal BigDecimal(String s); //常⽤,推荐使⽤
static BigDecimal valueOf(double d); //常⽤,推荐使⽤
其原因有
double 参数的构造⽅法,不允许使⽤因为它不能精确的得到相应的值;
String 构造⽅法是完全可预知的: 写⼊ new BigDecimal("0.1") 将创建⼀个 BigDecimal,它正好等于预期的0.1; 因此,通常建议优先使⽤String 构造⽅法;
静态⽅法 valueOf(double val) 内部实现,仍是将 double 类型转为 String 类型; 这通常是将 double(或float)转化为 BigDecimal 的⾸选⽅法;
如下代码测试操作:
public class BigDecimalDemo {
public static void main(String[] args) {
Double v1 = 2.43;
Double v2 = 4.0;
System.out.println(new BigDecimal(v1));
System.out.println(new BigDecimal(v2));
System.out.println(new String()));
System.out.println(new String()));
System.out.println(BigDecimal.valueOf(v1));
System.out.println(BigDecimal.valueOf(v2));
}
}
以上输出的结果是:
2.430000000000000159872115546022541821002960205078125
4
2.43
4.0
2.43
4.0
从结果可以看的出来直接 new BigDecimal()的情况会出现数据精准度丢失的情况
⽽. valueof 和 new 字符串的形式却不会使精度丢失
我们可以看⼀下他的源码:
/**
* Translates a {@code double} into a {@code BigDecimal}, using
* the {@code double}'s canonical string representation provided
* by the {@link Double#toString(double)} method.
*
*
Note:
Note: This is generally the preferred way to convert
* a {@code double} (or {@code float}) into a
* {@code BigDecimal}, as the value returned is equal to that
* resulting from constructing a {@code BigDecimal} from the
* result of using {@link Double#toString(double)}.
*
* @param val {@code double} to convert to a {@code BigDecimal}.
* @return a {@code BigDecimal} whose value is equal to or approximately
* equal to the value of {@code val}.
* @throws NumberFormatException if {@code val} is infinite or NaN.
* @since 1.5
*/
public static BigDecimal valueOf(double val) {
/
/ Reminder: a zero double returns '0.0', so we cannot fastpath
// to use the constant ZERO. This might be important enough to
// justify a factory approach, a cache, or a few private
// constants, later.
return new String(val));
}
valueof 的形式是将 double 直接 tostring 为⼀个字符串的形式进⾏转换的
BigDecimal 的⼤⼩⽐较
BigDecimal是Java⾥精确计算的类,下⾯说⼀下两个BigDecimal对象⼤⼩,相等的判断。⼀般的对象⽤equals,但是BigDecimal⽐较特殊,举个例⼦:
public static void main(String[] args) {
BigDecimal a = new BigDecimal("10.00");
BigDecimal b = new BigDecimal("10");
//equals⽅式bigdecimal转换为integer
System.out.println(a.equals(b)); //结果为: false
//toPlainString再equals
System.out.PlainString().PlainString())); //结果为: false //longValue⽅式
System.out.println(a.longValue() == b.longValue()); //结果为: true
//compareTo
System.out.println(apareTo(b) == 0); //结果为: true
}
看似使⽤ Long 数据类型进⾏⽐较也可以但是我们看下⼀个例⼦:
public static void main(String[] args) {
BigDecimal a = new BigDecimal("10.300003");
BigDecimal b= new BigDecimal(10.300003);
System.out.println(b.equals(a)); //false
System.out.PlainString().PlainString())); //false System.out.println(b.longValue() == a.longValue()); //true
System.out.println(bpareTo(a) == 0); //false
}
为什么compareTo⽅法不可以了,⽽longValue⽅式却还是OK的。让我们打印⼀下。public static void main(String[] args) {
BigDecimal a = new BigDecimal("10.300003");
BigDecimal b= new BigDecimal(10.300003);
System.out.println(b.equals(a)); //false
System.out.PlainString().PlainString())); //false System.out.println(b.longValue() == a.longValue()); //true
System.out.println("b.longValue():"+b.longValue());
System.out.println("a.longValue():"+a.longValue());
System.out.println(bpareTo(a) == 0); //false
}
⽽输出的结果令我懵逼
false
false
true
b.longValue():10
a.longValue():10
false
我们可以看出longvalue 的结果是没有⼩数点的所以对 BigDecimal 数据类型进⾏⽐较的时候还是使⽤"compareTo"⽅法
总结: 当我们需要使⽤BigDecimal 进⾏数据转换时⼀定要注意转换的数据类型以及⼤⼩⽐较的唯⼀⽅法我们可以对它的值进⾏的判断如: public static void main(String[] args) {
BigDecimal a = new BigDecimal("10.300003");
BigDecimal b= BigDecimal.valueOf(10.3);
System.out.println(bpareTo(a) < 0); //true
System.out.println(bpareTo(a) > 0); //false
}
最后:感谢⼤家的阅读
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论