如何将double转换为字符串?

如何将double转换为字符串?

问题描述:

我知道大多数编程语言都有内置的功能来完成这些功能,但这些功能又是如何工作的?如何将double转换为字符串?

+4

它在每种语言不同的做法,所以我会说,这是非常语言_dependent_,不是不可知。 – Oded 2010-10-13 19:33:46

一个简单的(但非通用,幼稚和慢的方式):

  • 数转换成整数,然后通过10逐步除以该值来找出其位数以相反的顺序。将它们连接在一起,就可以得到整数表示。
  • 减去原始数字中的整数,现在逐步乘以10并找到小数点后的数字。用一个点和第二个字符串连接第一个字符串。

这有几个问题,当然,:

  • 缓慢的地狱;
  • 不适用于负数;
  • 不会给你非常小的或大量的指数表示法。

总而言之,这是一个想法,但不是一个很好的想法;我怀疑没有这样做的编程语言。

+0

我看过C代码,它只是简单地将double转换为long并直接访问这些位。 (如果我没有记错的话,它是来自Quake引擎的着名的优化的invsqrt()函数)。但问题是,你将不得不直接处理所有这些边界案例(NaN,Inf等),并且规范并不是很短的读/执行;) – tux21b 2010-10-13 19:50:06

由于Oded在评论中提到,不同的语言会以不同的方式做到这一点。作为例子,here's how Ruby 1.9 does it(在C中)。作为一项研究工作,您最好的选择是研究开放源代码的语言,看看它们是如何实现的。

+0

所以Ruby基本上调用printf,这几乎不是语言不可知。 – Jess 2010-10-13 19:43:30

javadoc关于双toString()方法是相当全面:

创建double参数的字符串表示。下面提到的所有字符都是ASCII字符。

  • 如果参数是NaN,则结果是字符串“NaN”。
  • 否则,结果是表示参数的符号和大小(绝对值)的字符串。如果符号是负数,结果的第一个字符是' - '(' - ');如果符号为正,则结果中不会出现符号字符。至于幅度m:
  • 如果m是无穷大,它由字符“Infinity”表示;因此,正无限产生结果“无穷”,负无穷产生结果“无穷”。
  • 如果m为零,则由字符“0.0”表示;因此,负零产生结果“-0.0”,正零产生结果“0.0”。
  • 如果m大于或等于10^-3但小于10^7,则它表示为m的整数部分,以十进制形式表示,不带前导零,后跟'。'。 (。),后跟一个或多个表示m的小数部分的十进制数字。
  • 如果m小于10^-3或不小于10^7,则以所谓的“计算机科学记数法”表示。假设n是唯一的整数,例如10^n < = m < 10 ^(n + 1);那么令a为m和10^n的数学精确商,以便1 < = a < 10.然后将幅度表示为a的整数部分,作为单个十进制数字,后面跟着'。'。 (。),接着是十进制数字,表示a的小数部分,后面跟着字母'E'(E),后面跟着一个由十进制整数表示的n,由Integer.toString(int)方法产生。

对于m或a的小数部分,必须打印多少位数?必须至少有一位数字来表示小数部分,并且除此之外还需要多少位数,但只需要多少位数来唯一地区分参数值和类型为double的相邻值。也就是说,假设x是由该方法对有限非零参数d产生的十进制表示所表示的精确数学值。那么d必须是最接近x的double值;或者如果两个double值等于x,那么d必须是其中的一个,并且d的有效数的最低有效位必须为0.

这足够吗?否则,您可能也希望查找实现...

Guy Steele的这篇论文提供了有关如何正确执行此操作的详细信息。它比你想象的要微妙得多。

http://portal.acm.org/citation.cfm?id=93559