你如何将双精度转换为字符串?

时间:2010-10-13 19:30:42

标签: string language-agnostic double

我知道大多数编程语言都内置了为您执行此操作的功能,但这些功能如何工作?

5 个答案:

答案 0 :(得分:2)

关于Double toString()方法的javadoc非常全面:

  

创建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)方法生成。 / LI>   
     

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

这够了吗?否则你可能也想查看实现......

答案 1 :(得分:0)

简单(但非通用,天真和缓慢的方式):

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

当然,这有一些问题:

  • 地狱慢;
  • 不适用于负数;
  • 不会为非常小或大的数字提供指数表示法。

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

答案 4 :(得分:-1)

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