没有科学计数法的Java十进制数的简单字符串表示形式

Java中用于十进制数字的主要类型 /对象是float / Float , double / Double和BigDecimal 。 在每种情况下,其“默认”字符串表示形式都是“计算机科学计数法”。 这篇文章演示了一些简单的方法,可以在没有科学符号的情况下提供十进制数的字符串表示形式。

本文中的示例将演示这些Java数值类型的“默认”科学表示法,其中每种类型的数字都使用一定范围的数字表示,这些数字表示了每种类型的“默认”表示法在何处变为科学表示法。 接下来的三个代码清单显示了用于构造floatdoubleBigDecimal的常规范围的代码。 这些示例的完整源代码清单可在GitHub上找到 。

构造浮点示例范围

/*** Writes floats in the provided format and in the* provided range to standard output.** @param start Float to start writing.* @param threshold Float past which to not write anymore.* @param delta Delta for each increment of floats to be written.* @param label Label for header.* @param format Format for print out.*/
private static void writeFloatsToOutput(final float start,final float threshold,final float delta,final String label,final Format format)
{out.println(generateHeader(label));float floatValue = start;do{out.println("= " + format.fromFloat(floatValue));floatValue += delta;}while (floatValue < threshold);
}

构造双打的示例范围

/*** Writes doubles in the provided format and in the* provided range to standard output.** @param start Double to start writing.* @param threshold Double past which to not write anymore.* @param delta Delta for each increment of doubles to be written.* @param label Label for header.* @param format Format for print out.*/
private static void writeDoublesToOutput(final double start,final double threshold,final double delta,final String label,final Format format)
{out.println(generateHeader(label));double doubleValue = start;do{out.println("= " + format.fromDouble(doubleValue));doubleValue += delta;}while (doubleValue < threshold);
}

构造BigDecimals的示例范围

/*** Writes BigDecimals in the provided format and in the* provided range to standard output.** @param start BigDecimal to start writing.* @param threshold BigDecimal past which to not write anymore.* @param delta Delta for each increment of BigDecimals to be written.* @param label Label for header.* @param format Format for print out.*/
private static void writeBigDecimalsToOutput(final BigDecimal start,final BigDecimal threshold,final BigDecimal delta,final String label,final Format format)
{out.println(generateHeader(label));BigDecimal decimal = start;do{out.println("= " + format.fromBigDecimal(decimal));decimal = decimal.add(delta);}while (decimal.compareTo(threshold) < 0);
}

可以使用指定的范围调用上面显示的三种方法,以说明何时自动将科学计数法用于Java十进制类型的String表示形式。 接下来的三个输出列表中显示了每种数值类型以“默认”格式运行上述命令的输出。

非常小的和非常大的float的默认表示形式确实包括科学符号,用于显示最小的数字和显示最大的数字。 这些数字说明了Float.toString(Float)文档中讨论的内容:数字“小于10 -3或大于或等于10 7 ”以“所谓的“计算机科学表示法”表示。

==========================
= Small Floats (DEFAULT) =
==========================
= 8.5E-4
= 9.5E-4
= 0.00105
= 0.0011499999
= 0.0012499999
= 0.0013499998
= 0.0014499997
= 0.0015499997
= 0.0016499996
= 0.0017499996
= 0.0018499995
= 0.0019499995
==========================
= Large Floats (DEFAULT) =
==========================
= 9999995.0
= 9999996.0
= 9999997.0
= 9999998.0
= 9999999.0
= 1.0E7
= 1.0000001E7
= 1.0000002E7
= 1.0000003E7
= 1.0000004E7

非常小的double和非常大的double的默认表示形式确实包括对显示的最小数字和显示的最大数字的科学计数法。 这些数字说明了Javadoc文档中Double.toString(double)所讨论的内容 :数字“小于10 -3或大于或等于10 7 ”以“所谓的“计算机科学计数法”表示。

===========================
= Small Doubles (DEFAULT) =
===========================
= 8.5E-4
= 9.5E-4
= 0.00105
= 0.00115
= 0.00125
= 0.00135
= 0.0014500000000000001
= 0.0015500000000000002
= 0.0016500000000000002
= 0.0017500000000000003
= 0.0018500000000000003
= 0.0019500000000000003
===========================
= Large Doubles (DEFAULT) =
===========================
= 9999995.0
= 9999996.0
= 9999997.0
= 9999998.0
= 9999999.0
= 1.0E7
= 1.0000001E7
= 1.0000002E7
= 1.0000003E7
= 1.0000004E7

尽管floatdouble的最小和最大数字用科学计数法表示,但BigDecimal仅默认情况下对较小的数字执行此操作。 BigDecimal.toString()Javadoc文档中对此进行了描述:“如果小数位数大于或等于零,并且调整后的指数大于或等于-6,则数字将转换为字符形式而无需使用指数表示法。 …如果…调整后的指数小于-6,则数字将使用指数表示法转换为字符形式。”

===============================
= Small BigDecimals (DEFAULT) =
===============================
= 8.5E-7
= 9.5E-7
= 0.00000105
= 0.00000115
= 0.00000125
= 0.00000135
= 0.00000145
= 0.00000155
= 0.00000165
= 0.00000175
= 0.00000185
= 0.00000195
===============================
= Large BigDecimals (DEFAULT) =
===============================
= 99999950000000000000000000000000000000000000000000
= 99999960000000000000000000000000000000000000000000
= 99999970000000000000000000000000000000000000000000
= 99999980000000000000000000000000000000000000000000
= 99999990000000000000000000000000000000000000000000
= 100000000000000000000000000000000000000000000000000
= 100000010000000000000000000000000000000000000000000
= 100000020000000000000000000000000000000000000000000
= 100000030000000000000000000000000000000000000000000
= 100000040000000000000000000000000000000000000000000
private static void writeFormattedValues(final Format format)
{writeFloatsToOutput(0.00085f, 0.002f, 0.0001f, "Small Floats (" + format + ")", format);writeFloatsToOutput(9_999_995f, 10_000_005f, 1f, "Large Floats (" + format + ")", format);writeDoublesToOutput(0.00085d, 0.002d, 0.0001d, "Small Doubles (" + format + ")", format);writeDoublesToOutput(9_999_995d, 10_000_005d, 1d, "Large Doubles (" + format + ")", format);writeBigDecimalsToOutput(new BigDecimal("0.00000085"),new BigDecimal("0.000002"),new BigDecimal("0.0000001"),"Small BigDecimals (" + format + ")",format);writeBigDecimalsToOutput(new BigDecimal("99999950000000000000000000000000000000000000000000"),new BigDecimal("100000050000000000000000000000000000000000000000000"),new BigDecimal("10000000000000000000000000000000000000000000"),"Large BigDecimals (" + format + ")",format);
}

上面代码中非常小和非常大的数字的表示形式可以采用默认格式,也可以采用不使用科学计数法的格式表示。 接下来显示Format枚举的代码清单,该枚举演示了可以与floatdoubleBigDecimal使用的方法,而无需科学的表示法。

Format.java

/*** Supports rendering of Java numeric types float, double,* and BigDecimal in "default" format and in format that* avoids use of scientific notation.*/
public enum Format
{DEFAULT{@Overridepublic String fromFloat(final float floatValue){return String.valueOf(floatValue);}@Overridepublic String fromDouble(final double doubleValue){return String.valueOf(doubleValue);}@Overridepublic String fromBigDecimal(final BigDecimal bigDecimalValue){return bigDecimalValue.toString();}},NO_EXPONENT{@Overridepublic String fromFloat(final float floatValue){return numberFormat.format(floatValue);}@Overridepublic String fromDouble(final double doubleValue){return numberFormat.format(doubleValue);}@Overridepublic String fromBigDecimal(final BigDecimal bigDecimalValue){return bigDecimalValue.toPlainString();}};private static final NumberFormat numberFormat = NumberFormat.getInstance();static{numberFormat.setMaximumFractionDigits(Integer.MAX_VALUE);numberFormat.setGroupingUsed(false);}public abstract String fromFloat(final float floatValue);public abstract String fromDouble(final double doubleValue);public abstract String fromBigDecimal(final BigDecimal bigDecimalValue);
}

Format枚举使用NumberFormat的一个实例,该实例禁用了分组并且将最大分数位数设置为Integer.MAX_VALUE,以确保在不使用科学计数法的情况下呈现floatdouble 。 使用BigDecimal的toPlainString()方法甚至可以轻松完成此任务。

接下来显示使用Format.NO_EXPONENT运行代码的输出(并且看不到指数或科学符号)。

==============================
= Small Floats (NO_EXPONENT) =
==============================
= 0.0008500000112690032
= 0.0009500000160187483
= 0.0010499999625608325
= 0.0011499999091029167
= 0.001249999855645001
= 0.0013499998021870852
= 0.0014499997487291694
= 0.0015499996952712536
= 0.0016499996418133378
= 0.001749999588355422
= 0.0018499995348975062
= 0.0019499994814395905
==============================
= Large Floats (NO_EXPONENT) =
==============================
= 9999995
= 9999996
= 9999997
= 9999998
= 9999999
= 10000000
= 10000001
= 10000002
= 10000003
= 10000004
===============================
= Small Doubles (NO_EXPONENT) =
===============================
= 0.00085
= 0.00095
= 0.00105
= 0.00115
= 0.00125
= 0.00135
= 0.0014500000000000001
= 0.0015500000000000002
= 0.0016500000000000002
= 0.0017500000000000003
= 0.0018500000000000003
= 0.0019500000000000003
===============================
= Large Doubles (NO_EXPONENT) =
===============================
= 9999995
= 9999996
= 9999997
= 9999998
= 9999999
= 10000000
= 10000001
= 10000002
= 10000003
= 10000004
===================================
= Small BigDecimals (NO_EXPONENT) =
===================================
= 0.00000085
= 0.00000095
= 0.00000105
= 0.00000115
= 0.00000125
= 0.00000135
= 0.00000145
= 0.00000155
= 0.00000165
= 0.00000175
= 0.00000185
= 0.00000195
===================================
= Large BigDecimals (NO_EXPONENT) =
===================================
= 99999950000000000000000000000000000000000000000000
= 99999960000000000000000000000000000000000000000000
= 99999970000000000000000000000000000000000000000000
= 99999980000000000000000000000000000000000000000000
= 99999990000000000000000000000000000000000000000000
= 100000000000000000000000000000000000000000000000000
= 100000010000000000000000000000000000000000000000000
= 100000020000000000000000000000000000000000000000000
= 100000030000000000000000000000000000000000000000000
= 100000040000000000000000000000000000000000000000000

标准的Java浮点类型和BigDecimal类用科学计数法表示一些数字,但是很容易确保在不需要时不使用这种默认的科学计数法表示。

翻译自: https://www.javacodegeeks.com/2017/11/simple-string-representation-java-decimal-numbers-without-scientific-notation.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348633.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

几道题帮你搞定数据选择器

这里不写答案&#xff0c;只讲思路 这个逻辑表达式比较短&#xff0c;咱们首先就考虑到先将F写成最小项表达式 从三个自变量中选择两个作为选择器的地址变量&#xff0c;本题为A1A0AB 然后把C处理一下&#xff0c;化简式子&#xff0c;使得式子的每一项都有AB&#xff0c;每一…

Spring Data Solr教程:查询方法

我们已经了解了如何配置Spring Data Solr。 我们还学习了如何向Solr索引添加新文档&#xff0c;如何更新现有文档的信息以及从Solr索引删除文档。 现在是时候继续前进&#xff0c;学习如何使用Spring Data Solr从Solr索引中搜索信息。 我们的搜索功能的要求如下&#xff1a; 搜…

深入浅出时序逻辑电路(1)

我们一提到时序逻辑电路&#xff0c;就会想到触发器 先讲讲时序逻辑电路&#xff1a;时序逻辑电路&#xff08;常简称为时序电路&#xff09;内部包含存储器&#xff0c;用于记忆电路的工作状态和输入变化情况&#xff0c;其输出由当前的输入和存储信息共同确定的一种电路。 再…

云幸福–如何在几分钟内安装新的OpenShift Container Platform 3.7

此安装需要安装Red Hat Middleware产品流&#xff08;预先配置的容器选项&#xff09;以及所有其他功能&#xff0c;例如源容器&#xff0c;映像容器和.Net Core容器。自OpenShift容器平台发布以来&#xff0c;我一直希望提供一个简单的方法。 &#xff0c;完全配置且易于使用的…

从分析一个简单的时序电路入手

这道题怎么搞呢 先看图 看到了一个JK触发器&#xff0c;左边那个是J触发器转化为D触发器 右边那个就是JK触发器 写出两个次态方程&#xff1a;还有一个输出表达式&#xff1a;将激励函数带入表达式&#xff0c;求出两个次态方程 然后画出状态表&#xff1a; 再画出状态图&a…

组合逻辑电路运算法则

逻辑电路计算性质 与非门&#xff1a;有0出1&#xff0c;全1才0 & 或非门&#xff1a;有1出0&#xff0c;全0才1 >1 异或门&#xff1a;相同出0&#xff0c;不同出1 ⊕ 常用公式 ABAB‾\overline{B}BA AABA AAB‾\overline{B}BAB A00 A1A A*A‾\overline{A}A0 …

jmeter实现翻页功能_JMeter定制功能实现

jmeter实现翻页功能JMeter提供了可在采样器中使用的功能。 在编写复杂的测试计划时&#xff0c;您会觉得JMeter缺少某些方法。 您使用Beanshell脚本定义自己的自定义方法。 JMeter调用Beanshell解释器来运行脚本。 只要您不产生高负载&#xff08;大量线程&#xff09;&#xf…

常见的集成逻辑门(CMOS\TTL\ECL)

CMOS系列 TTL系列 ECL系列 集成逻辑门的主要性能指标 关于噪声容限UN 输出负载能力 总结一下&#xff1a;不管那么多&#xff0c;先把两个算出来&#xff0c;取最小的就完事了 答案&#xff1a;ECL,CMOS,ECL,CMOS

git如何快速提交代码(大学生适用)

众所周知&#xff0c;git是一个强大的版本控制工具 git的学习成本比较高&#xff0c;但大学生常用的功能也就那么几个 首先你需要下载一个git&#xff0c;生成一个密钥 生成方法&#xff1a;打开git&#xff08;bash&#xff09; $ ssh-keygen -t rsa -C “你的邮箱地址”&a…

Spring框架–应用程序上下文–到达应用程序上下文的三种方法

本文向您展示了三种不同的方式来获取代码中的Spring Framework Application Context。 摘要 &#xff08;这是我在2010年撰写的旧文章的转贴&#xff09;。 在Google中搜索“ Spring ApplicationContextAware ”时&#xff0c;您会遇到很多建议&#xff0c;而且我也看到很多人…

最简单的语言来说JAVA中的NEW到底怎么搞

new 到底是干啥的&#xff1f; JAVA中的new关键字就是在你声明了一个对象后&#xff0c;来给对象分配相应的内存&#xff0c;可以使用任何public来构造 People stunew People( ); new 在堆中为对象申请了一块空间&#xff0c;new也使用了父类的构造方法 java里的new的英文意…

34个计算机网络易错知识点总结

不属于网络体系结构所描述的内容是&#xff1a;协议的内部实现细节OSI模型中第N层为第N1层提供服务自下而上第一个提供端到端服务的是传输层通信子网&#xff1a;1.高速链路2.交换机3.路由器TCP/IP模型中一共由四层&#xff0c;分别是&#xff1a; 1.应用层&#xff1a;应用层是…

mongodb副本集_设置MongoDB副本集分为4个步骤

mongodb副本集介绍 在详细介绍配置MongoDB副本集之前&#xff0c;让我简要介绍一下它们&#xff1a; 副本集是Mongodb数据库提供的功能&#xff0c;可实现高可用性和自动故障转移。 它是一种传统的主从配置&#xff0c;但具有自动故障转移功能。 基本上&#xff0c;它是mong…

JAVA类的继承、覆写和final关键字

extends不用多说&#xff0c;是来继承的关键字&#xff0c;但它有几个要点&#xff1a; java不允许多重继承(一个类只能继承一个父类,不能继承多个父类)派生类会继承基类所有属性和方法,但不能直接访问基类的private私有属性实例化派生类时,会先去调用父类的构造方法构造基类,…

Spring Boot:使用Thymeleaf布局方言的Thymeleaf模板装饰器

介绍 在所有Thymeleaf模板上重用页眉和页脚的问题经常在StackOverflow上提出。 在本文中&#xff0c;我将向您展示如何使用Thymeleaf布局方言来结构化模板&#xff0c;以在Spring Boot应用程序中实现更高的代码可重用性。 创建一个Spring Boot应用程序 让我们使用Spring Initi…

猫、狗与Java的多态

多态&#xff08;Polymorphism&#xff09;按字面的意思就是“多种状态”。在面向对象语言中&#xff0c;接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术&#xff0c;赋值之后&#…

solr crud_Spring Data Solr教程:CRUD(差不多)

solr crud在我的Spring Data Solr教程的上一部分中&#xff0c;我们学习了如何配置Spring Data Solr。 现在该迈出一步&#xff0c;了解我们如何管理Solr实例中存储的信息。 此博客文章描述了我们如何向Solr索引添加新文档&#xff0c;如何更新现有文档的信息以及如何从索引中删…

子类覆盖父类(Java)

要求&#xff1a;尝试创建一个父类&#xff0c;在父类中创建两个方法&#xff0c;在子类中覆盖第二个方法&#xff0c;再为子类创建一个对象&#xff0c;将它向上转型并调用这个方法 由于Java里面没有虚函数&#xff0c;所以它的多态是可以被继承的 public class tyu{public …

在Java中进行输入验证时用错误通知替换异常

在我以前的文章中&#xff0c;我写了一个输入验证设计&#xff0c;该设计取代了难以维护和测试的 if-else块。 但是&#xff0c;正如某些读者指出的那样&#xff0c;它有一个缺点–如果输入数据有多个验证错误&#xff0c;则用户将不得不多次提交请求以查找所有错误。 从可用性…

Java构建子类对象时的顺序

先看一个这么的程序&#xff1a; //------------------------------------------------------------------------// //程序目的&#xff0c;创建一个父类与子类&#xff0c;分别创建构造方法 public abstract class usecase1 {abstract void testAbstract();usecase1(){//&…