科学计数方法显示"/>
【Java】float,double大数据不要科学计数方法显示
文章目录
- 1.前言:理论
- 2.实践
- 3.场景再现2
- 4.可能解决
转载:
1.前言:理论
- 科学计数法:如2E8, 2乘以10的8次方。
- 浮点数(float,double)整数部分达到8位及以上,会以科学计数法显示。
- 整数(int,long)不会显示成科学计数法。
2.实践
例子
long l1 = 1234567l;long l2 = 12345678l;long l3 = 123456789l;double f1 = 1234567f;double f2 = 12345678f;double f3 = 123456789f;double d1 = 1234567.123d;double d2 = 12345678.123d;double d3 = 123456789.123d;System.out.println("******* long *******");System.out.println(l1);System.out.println(l2);System.out.println(l3);System.out.println("******* float *******");System.out.println(f1);System.out.println(f2);System.out.println(f3);System.out.println("******* double *******");System.out.println(d1);System.out.println(d2);System.out.println(d3);
运行结果
******* long *******
1234567
12345678
123456789
******* float *******
1234567.0
1.2345678E7
1.23456792E8
******* double *******
1234567.123
1.2345678123E7
1.23456789123E8
怎么让float,double大数据在前端不以科学计数方法显示?
public static void main(String[] args) {double d = 123456789.128d;String s1 = big(d);String s2 = big2(d);System.out.println(d);System.out.println(s1);System.out.println(s2);}// 方法一:NumberFormatprivate static String big(double d) {NumberFormat nf = NumberFormat.getInstance();// 是否以逗号隔开, 默认true以逗号隔开,如[123,456,789.128]nf.setGroupingUsed(false);// 结果未做任何处理return nf.format(d);}//方法二: BigDecimalprivate static String big2(double d) {BigDecimal d1 = new BigDecimal(Double.toString(d));BigDecimal d2 = new BigDecimal(Integer.toString(1));// 四舍五入,保留2位小数return d1.divide(d2,2,BigDecimal.ROUND_HALF_UP).toString();}
运行效果:
1.23456789128E8
123,456,789.128
123456789.13
3.场景再现2
20201023 日,程序员节日的前一天 ,因为项目,突然发现数据量太大,又显示了科学计数法,关键我们这个字段名字叫
flow类型,然后数据是 102400000
但是却显示成 1.024E8 ,
怎么能让这个保持double类型的同时,不改变成科学技术法呢?
4.可能解决
我们也可以使用字符串表示,不使用数字。
或者如下未验证的案例
js数字的精度是有限的,Java的Long类型的数字超出了JavaScript的处理范围。
内部只有一种数字类型Number,双精度64位格式存储,即使整数也是如此。
最大的数值应该是2的53次方-1,十进制是【9007199254740991】,16位。
所以说超过16位,那么如果属于Number类型去解析的,就会丢失精度。
解决方案:
@JsonSerialize(using=ToStringSerializer.class)
更多推荐
【Java】float,double大数据不要科学计数方法显示
发布评论