本文目录一览:
- 1、java BigDecimal如何转换为科学计数法?
- 2、BigDecimal去除末尾多余的0
- 3、关于BigDecimal四舍五入的问题
- 4、java代码怎么把科学计数法转换为具体数字
- 5、如何使java中double类型不以科学计数法表示
- 6、BigDecimal强制用科学计数法表示
java BigDecimal如何转换为科学计数法?
BigDecimal a = new BigDecimal("1111111111111111111111111.1111", new MathContext(5, RoundingMode.HALF_UP));//构造BigDecimal时指定有效精度
System.out.println(a.toEngineeringString());//然后使用toEngineeringString
BigDecimal去除末尾多余的0
BigDecimal是处理高精度的浮点数运算的常用的一个类
当需要将BigDecimal中保存的浮点数值打印出来,特别是在页面上显示的时候,就有可能遇到预想之外的科学技术法表示的问题。
一般直接使用 BigDecimal.toString()方法即可以完成浮点数的打印。
如:
System.out.println( new BigDecimal("10000000000").toString());
但是,toString()方法输出的字符串并不能保证不是科学计数法。
不过在日常的使用中,用toString()方法输出的就是普通的数字字符串而非科学计数法。
直接这么写:
System.out.println( new BigDecimal("100.000").toString());
程序的输出即为: 100.000
如果我们希望去除末尾多余的0,那么我们应该这么写:
System.out.println( new BigDecimal("100.000").stripTrailingZeros().toString());
其中,stripTrailingZeros()函数就是用于去除末尾多余的0的,但是此时程序的输出为: 1E+2
是科学计数法,可能并不是我们想要的。
解决的方法很简单,如果想要避免输出科学计数法的字符串,我们要用toPlainString()函数代替toString()。如:
System.out.println( new BigDecimal("100.000").stripTrailingZeros().toPlainString());
此时程序的输出就为 100
使用@JsonSerialize输出
1.创建一个BigDecimal格式化工具
2.在返回的实体类对应的属性上加上注解:
关于BigDecimal四舍五入的问题
创建BigDecimal对象主要有两种。
BigDecimal b1 = new BigDecimal("1.34");//1.34
BigDecimal b2 = BigDecimal.valueOf(1.34);//1.34
其中b1也可以写成new BigDecimal(Double.toString(1.34)),可以直接new BigDecimal(1.34)吗,也是可以的,只是会出现精度问题。
BigDecimal one1 = new BigDecimal(1.34);//1.3400000000000000799360577730112709105014801025390625
BigDecimal two1 = new BigDecimal("1.34");//1.34
所以四舍五入的时候一定不要直接用double去四舍五入,不然有可能会因为精度的问题出现误差
比如:
因为new BigDecimal((double)0.85) 的结果是0.84999999999999997779553950749686919152736663818359375 而不是0.85
所以要用String去四舍五入
也可以用String.format()方法来四舍五入
小数之间的运算,因为也牵扯到精度问题,所以最好都转成BigDecimal之后去计算
比如加法:
详情文章参考:
java代码怎么把科学计数法转换为具体数字
首先,需要将科学计数法转换成一下:
例如:
BigDecimal bd = new BigDecimal("3.40256010353E11");
然后转换成字符串:
String str = bd.toPlainString();
如果这个数字的长度是在int的范围内的话,是可以转换成int类型:
int a = Integer.parsInt(str);
如果这个数字的长度不是在Int范围内的话,得到的就不是你想要的数字了!
如何使java中double类型不以科学计数法表示
在java中,把一个double或者BigDecimal的小数转换为字符串时,经常会用科学计数法表示,而我们一般不想使用科学计数法,可以通过:
DecimalFormat a = new DecimalFormat("#,##0.00000000");
System.out.println(a.format(11111111.0000001000000001));
的方式来格式化输出字符串。
对于BigDecimal的小数,如果制定精度=6, 则可以放心的使用其toString函数。但是对于6的精度,有可能会使用科学计数法,查看器代码有如下判断:
long adjusted = -(long)scale + (coeff.length-1);
if ((scale = 0) (adjusted = -6)){
非科学计数法的toString.
}
其中scale指BigDecimal的精度,
coeff对应使用BigInteger存储的值的toString字符串, coeff = intVal.abs().toString().toCharArray(),也就是说BigDecimal在对应精度下的整数值,例如BigDecimal ob = new BigDecimal(0.00000011), ob的精度为7, 则coeff="1";如果ob=new BigDecimal(0.10000011), 则coeff="1000001";如果ob=new BigDecimal(0.00000001), 则coeff="0";
BigDecimal强制用科学计数法表示
MathContext m = new MathContext(3) ;
BigDecimal bd = new BigDecimal("1234E+6",m) ;
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, website.service08@gmail.com 举报,一经查实,本站将立刻删除。