1、背景

在日常开发中有时会使用到float或double数据类型,然而在前端接收到数据时发现数据为科学记数法,此时不能满足业务显示直观的需求。为什么float和double会变成科学记数法格式呢?什么情况下会自动转换?

2、思考

带着上面的两个问题,我们一起撸撸源码吧。

(1) Float类对数据赋值和显示时会调用toString()方法:

    public static String toString(float f) {return FloatingDecimal.toJavaFormatString(f);}

(2) 在FloatingDecimal类中调用toJavaFormatString()时,需要调用转换器:

public static String toJavaFormatString(float var0) {return getBinaryToASCIIConverter(var0).toJavaFormatString();
}

(3) 其中BinaryToASCIIConverter接口的toJavaFormatString()方法实现如下:

public String toJavaFormatString() {int var1 = this.getChars(this.buffer);return new String(this.buffer, 0, var1);
}

(4) 在getChars()方法中,float和double完成了科学记数法的变形

if (this.decExponent > 0 && this.decExponent < 8) {var3 = Math.min(this.nDigits, this.decExponent);System.arraycopy(this.digits, this.firstDigitIndex, var1, var2, var3);var5 = var2 + var3;if (var3 < this.decExponent) {var3 = this.decExponent - var3;Arrays.fill(var1, var5, var5 + var3, '0');var5 += var3;var1[var5++] = '.';var1[var5++] = '0';} else {var1[var5++] = '.';if (var3 < this.nDigits) {int var4 = this.nDigits - var3;System.arraycopy(this.digits, this.firstDigitIndex + var3, var1, var5, var4);var5 += var4;} else {var1[var5++] = '0';}}
} else if (this.decExponent <= 0 && this.decExponent > -3) {var5 = var2 + 1;var1[var2] = '0';var1[var5++] = '.';if (this.decExponent != 0) {Arrays.fill(var1, var5, var5 - this.decExponent, '0');var5 -= this.decExponent;}System.arraycopy(this.digits, this.firstDigitIndex, var1, var5, this.nDigits);var5 += this.nDigits;
} else {var5 = var2 + 1;var1[var2] = this.digits[this.firstDigitIndex];var1[var5++] = '.';if (this.nDigits > 1) {System.arraycopy(this.digits, this.firstDigitIndex + 1, var1, var5, this.nDigits - 1);var5 += this.nDigits - 1;} else {var1[var5++] = '0';}var1[var5++] = 'E';if (this.decExponent <= 0) {var1[var5++] = '-';var3 = -this.decExponent + 1;} else {var3 = this.decExponent - 1;}if (var3 <= 9) {var1[var5++] = (char)(var3 + 48);} else if (var3 <= 99) {var1[var5++] = (char)(var3 / 10 + 48);var1[var5++] = (char)(var3 % 10 + 48);} else {var1[var5++] = (char)(var3 / 100 + 48);var3 %= 100;var1[var5++] = (char)(var3 / 10 + 48);var1[var5++] = (char)(var3 % 10 + 48);}
}

在此部分代码中,分为三个大部分进行了转换:小数点前的位数大于0位但小于8位,数值为小于1且小数点紧跟的0小于3个,小数点前位数大于等于8位或纯小数的小数点后的0大于等于3。

简而言之,当数据为12345678或者0.0001222类型时,float或double数据会自动转换为科学记数法格式。

3、解决方法

(1) 数据采用BigDecimal格式

(2) NumberFormat

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);}// 方法一:NumberFormat
private static String big(double d) {NumberFormat nf = NumberFormat.getInstance();// 是否以逗号隔开, 默认true以逗号隔开,如[123,456,789.128]nf.setGroupingUsed(false);// 结果未做任何处理return nf.format(d);}//方法二: BigDecimal
private 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();}

java中float和double为什么会转为科学记数法?相关推荐

  1. java中float、double和BigDecimal的精度问题(fastjson、Jackson以及实例化的方式)

    java中float.double和BigDecimal的精度问题(fastjson.Jackson以及实例化的方式): 问题描述 java中如果使用float或double类型的数据初始化BigDe ...

  2. Java中float和double精度

    http://zhidao.baidu.com/question/344295417.html?seed=0 float与double的区别 单精度浮点数在机内占4个字节,用32位二进制描述. 双精度 ...

  3. java中float和double的取值范围

    float:4字节(32bit),IEEE 754. 范围: [-3.40282346638528860e+38 , -1.40129846432481707e-45] ∪ [1.4012984643 ...

  4. Java中float与double之间的区别?

    文章目录 float类型与double类型的区别 测试用例 Ending~! 提示:以下是本篇文章正文内容,下面案例可供参考 float类型与double类型的区别 float表示单精度浮点型,占用4 ...

  5. java中float和double型数据在赋值时有哪些注意事项?,java语言中float和double类型的数据在编程时的注意事项...

    float和double类型的数据在编程时的需要注意的地方 package execisetest; public class AccuranceTest {     public static vo ...

  6. Java中float与double的区别

    float : 单精度浮点数 double : 双精度浮点数 两者的主要区别如下: 01.在内存中占有的字节数不同 单精度浮点数在机内存占4个字节 双精度浮点数在机内存占8个字节 02.有效数字位数不 ...

  7. JAVA中float和double的区别、String和char的区别

    float 表示单精度浮点数在机内占4个字节,用32位二进制描述. double 表示双精度浮点数在机内占8个字节,用64位二进制描述. 对编程人员来说,double精度高,但double的运算速度比 ...

  8. java double long 取值_由一道题引起的思考? java中 long 和double都是64位。为什么double表示的范围大那么多呢?...

    由一道题引起的思考? java中 long 和double都是64位.为什么double表示的范围大那么多呢? 百度标准答案是这样子的: double是n*2^m(n乘以2的m次方)这种形式存储的,只 ...

  9. mysql double 存储_关于MYSQL中FLOAT和DOUBLE类型的存储-阿里云开发者社区

    关于MYSQL中FLOAT和DOUBLE类型的存储 重庆八怪 2016-04-12 844浏览量 简介: 关于MYSQL中FLOAT和DOUBLE类型的存储 其实在单精度和双精度浮点类型存储中其存储方 ...

最新文章

  1. 博士生起诉学校,因核心期刊发文数不够申请学位被拒,一审判决胜诉!
  2. JS中location对象使用
  3. 【直播回放】新手如何入门并学习计算机视觉?
  4. pyqt5从子目录加载qrc文件_【JVM系统学习之路】一篇看懂类加载
  5. php基础教程 第五步 逻辑控制
  6. HALCON学习之旅(四)
  7. MAVEN项目的搭建
  8. 行业动态_天才、忽悠与炮灰
  9. Linux命令学习系列-用户切换su,sudo
  10. 如何评价一个好系统?
  11. 深度剖析:PS中的3大类调色功能。
  12. “基础设施IP映射”你听说吗?
  13. unity3D-learning:UI背包系统
  14. 【论文精读】TACRED Revisited: A Thorough Evaluation of the TACRED Relation Extraction Task
  15. Oracle的安装及导入.dmp文件教程
  16. 一款简单好用的数字温度传感器芯片介绍
  17. STM32基础(11)光敏传感
  18. HDU 5544 Ba Gua Zhen (dfs独立回路异或消元)
  19. 二进制,八进制,十进制,十六进制转换算法
  20. 企业邮箱申请流程注意哪些方面?

热门文章

  1. 个人电脑如何搭服务器?家中自建服务器可行吗?需要哪些搭建条件
  2. python白噪声检验_时间序列 平稳性检验 白噪声 峰度 偏度
  3. /lib//libclntsh.so: file format not recognized; treating as linker script
  4. python 解一元二次方程的根
  5. air for andriod学习笔记1- 将现有fla文件生成为apk
  6. Java HotSpot 虚拟机选项 -X -XX 的含义
  7. oracle智能便携投影机,智能投影 篇四:天猫精灵投影仪上手体验,小巧便携+内置电池,李佳琦带货推荐...
  8. 用jq做一个点击图片放大消失
  9. 网易云课堂web安全第一天
  10. 远程唤醒 过一段时间 失效