Java 科学计数法

1 科学计数法的概念

1.1 有效数字

在一个近似数中,从左边第一个不是0的数字起,到精确到的位数止,这中间的所有数字都叫做这个近似数的有效数字

例如:

890314000保留三位有效数字为8.90×10的8次方 (四舍)

839960000保留三位有效数字为8.40×10的8次方 (五入)

0.00934593保留三位有效数字为9.35×10的-3次方

1.2 E记号

大多数计算器及计算机程序用科学记数法显示非常大和非常小的结果。因为指数上标(例如1011)在屏幕上显示不方便,字母E或e通常是用来代表的十次幂(写作“×10b”),E或e之后的数字是它的指数;换句话说,任何两实数a和b(b应为整数),“aEb”所表示的值是a × 10b。注意,这种用法中字母e不是数学常数e,也不是指数函数exp()(采用用大写字母E显示可以更大程度地避免误解);尽管它也表示指数,但这个符号通常被称为(科学计数法)E或e符号,而不是指数中的底数符号(尽管后者也会出现)。在正式的出版物中尽量不要使用这种显示方法。

注意科学记数法中的e或E与数学常数e或函数exp没有关系。

这种写法是因为一些计算机程序中不方便写上标而产生的,在正式出版物中不应当使用这种写法。

我国国家标准中科学计数法均用a ×10b的形式表示,而不是aEb(参见GB3101-1993,GBT15835-2011,GBT8170-2008)。


2 Java中的科学计数法

在Java中,当Double的取值符合某条件时,将会以科学计数法的方式显示(下面是个人测试的结果,非从文档中得到的结论):

@Test
public void testPrintScientificNotation() {
//整数部分位数大于等于8时开始以科学计数法显示
System.out.println(-12345678.0);
System.out.println(12345678.0);
//整数位为0,当小数位以0开始连续出现大于等于3时开始以科学计数法显示
System.out.println(0.0001);
System.out.println(-0.0001);
}

结果

-1.2345678E7
1.2345678E7
1.0E-4
-1.0E-4

很多时候,我们需要做一个统一,要么全部以科学计数法输出,要么就全部显示为普通计数。

根据网上的资料,主要提及NumberFormat、DecimalFormat、BigDecimal这三种API实现方式。

2.1 NumberFormat

NumberFormat 是所有数值格式的抽象基类。

public static String scientificNotation2String(Double d, int newValue) {
String value = null;
NumberFormat nf = NumberFormat.getInstance();
// 设置此格式中不使用分组
nf.setGroupingUsed(false);
// 设置数的小数部分所允许的最大位数。
nf.setMaximumFractionDigits(newValue);
value = nf.format(d);
return value;
}

如果输入的小数位数,大于设定的最大的小数位数,则会进行四舍五入。

2.2 DecimalFormat

DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字。该类设计有各种功能,使其能够解析和格式化任意语言环境中的数,包括对西方语言、阿拉伯语和印度语数字的支持。它还支持不同类型的数,包括整数 (123)、定点数 (123.4)、科学记数法表示的数 (1.23E4)、百分数 (12%) 和金额 ($123)。所有这些内容都可以本地化。

public static String scientificNotation2String(Double d) {
String value = null;
DecimalFormat decimalFormat = new DecimalFormat("0.00");//格式化设置
value = decimalFormat.format(d);
return value;
}

需要设置模版,指定小数保留的位数,传入数值小数位数超出指定位数,则会进行四舍五入;传入数值小数位不足指定位数,则可以设置补零。

需要将数值转换为科学计数法只须将模版修改即可,例如将模版修改为:0.##E0

2.3 BigDecimal

BigDecimal是不可变的、任意精度的有符号十进制数。

public static String scientificNotation2String(String str) {
String value = null;
BigDecimal bd = new BigDecimal(str);
value = bd.toPlainString();
return value;
}

BigDecimal的构造方法很多,不一定是要传入String类型的值。

BigDecimal中的toString方法和toPlanString方法的区别:

  • toString():返回此BigDecimal的字符串表示形式,如果需要指数,则使用科学计数法
  • toPlainString():返回不带指数字段的此BigDecimal的字符传表示形式

参考


作者信息

湛耀 软件工程师

博客园:http://www.cnblogs.com/zhanyao/

邮箱:xzhanyao@foxmail.com


欢迎指出不足,大家共同提高

Java 科学计数法的更多相关文章

  1. java科学计数法转换成普通计数法

    java科学计数法转换成普通计数法: String sjiachun = "12345E-10"; BigDecimal db = new BigDecimal(sjiachun) ...

  2. java 科学计数法表示转换

    BigDecimal strScien = new BigDecimal("9.67953970412123E-05"); System.out.println(strScien. ...

  3. 如何使java中double类型不以科学计数法表示

    在java中,把一个double或者BigDecimal的小数转换为字符串时,经常会用科学计数法表示,而我们一般不想使用科学计数法,可以通过:DecimalFormat a = new Decimal ...

  4. Java将Excel中科学计数法解析成数字

    需要注意的是一般的科学表达式是1.8E12 1.8E-12 而在Excel中的科学表达式是1.8E+12 1.8E-12 我写的科学计数法的正则表达式是(-?\d+\.?\d*)[Ee]{1}[\+- ...

  5. java中Double类数字太大时页面正常显示而不要用科学计数法

    /** * 当浮点型数据位数超过10位之后,数据变成科学计数法显示.用此方法可以使其正常显示. * @param value * @return Sting */ public static Stri ...

  6. java使用poi解析或处理excel的时候,如何防止数字变成科学计数法的形式和其他常见Excel中数据转换问题

    当使用POI处理excel的时候,遇到了比较长的数字,虽然excel里面设置该单元格是文本类型的,但是POI的cell的类型就会变成数字类型. 而且无论数字是否小数,使用cell.getNumberi ...

  7. Java jxl导入excel文件,导入的数字、身份证号码、手机号变成了科学计数法,解决方案

    原文出自:https://blog.csdn.net/seesun2012 这是一个execl文件导入数据库操作,使用jxl解析execl导入数据库过程出现了科学计数法,与想要导入的数据不匹配,以下是 ...

  8. java中科学计数法数字转字符串

    开发过程中有可能会遇到很小的数字,在显示过程中就转换成了科学计数法,这种不利于人的观看,于是就有必要转成字符串形式的.so. 将科学计数法的数字转换成字符串: 使用的是java.math的BigDec ...

  9. Java中的浮点数-科学计数法-加减乘除

    上次,提到"元转分"这个浮点数问题,boss倾向于手动把1.23元这种格式,转换成123分.    但实际上,浮点数很容易遇到精度问题.    比如,System.out.prin ...

随机推荐

  1. cocos2d-x 3.1.1 学习笔记[11] http请求 + json解析

    //http须要引入的头文件和命名空间 #include <network/HttpClient.h> using namespace network; //json须要引入的头文件 #i ...

  2. Ubuntu——修正LibreOffice中文乱码以及eclipse提示框颜色

    刚进ubuntu的时候就老遇到用libreoffice打开某些文档时出现一堆叠在一起的乱码.以及最開始使用eclipse编辑时,鼠标放到一个变量或者函数时 弹出来一黑框框-看的难受的.... 这里记录 ...

  3. GCC与G++那些事儿

    StackOverflow上一个很有名的问题,gcc和g++到底有什么区别? 答案如下: GCC: GNU Compiler Collection 指的是GNU编译器所支持的所有不同的类型的语言 gc ...

  4. chrome 浏览器 的一些控制台技巧

    1.查找dom元素.但它并不支持jquery语法. $$("#fock");   // 目前仅仅知道可以查找Dom元素 2.查找dom元素绑定的事件. getEventListen ...

  5. mac os x 使用scp取代sz rz

    在windows下,能够通过secureCRT的sz来下载文件,而用rz来上传文件.在unix/linux下则不必.由于scp命令能够完毕这项目工作. sz file替代方案为:scp usernam ...

  6. 获取Oracle隐含參数信息

    Oracle数据库的初始化參数.主要来源于两个Oracle内部数据字典表:X$KSPPCV和X$KSPPI通常我们查询的V$Parameter视图或使用show parameter命令都是就来源于这两 ...

  7. vue的计算属性

    在模板中写入过多的逻辑使模板过重且难以维护.因此有了计算属性(computed)的产生. 你可以像绑定普通属性一样在模板中绑定计算属性,vue知道计算属性中的函数依赖data中的数据.所以当data中 ...

  8. HUAWEI HiAI常见FAQ小贴士

    8月7日,HUAWEI HiAI系统架构师在CSDN平台为广大开发者进行了以“APP进阶实战:最快10分钟接入HUAWEI HiAI”主题的直播,迎来600多名开发者在线上观看. ​ 直播中,讲师详细 ...

  9. 使用Hyper-V安装Ubuntu16.04 Server 网络配置

    由于最近在研究Docker, 于是需要用到虚拟机,安装Ubuntu 16.04到Hyper-V并部署Docker.这个过程中填平了几个小坑,为了大家以后遇到类似情况节省时间,我将这几个小坑的问题和解决 ...

  10. Linux Linux程序练习四

    编写两个不同的可执行程序,名称分别为a和b,b为a的子进程. 在a程序中调用open函数打开a.txt文件. 在b程序不可以调用open或者fopen,只允许调用read函数来实现读取a.txt文件. ...