我知道大多数编程语言都内置了为您执行此操作的功能,但这些功能如何工作?
答案 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)
简单(但非通用,天真和缓慢的方式):
当然,这有一些问题:
总而言之,这是一个想法,但不是一个很好的想法;我怀疑没有编程语言可以做到这一点。
答案 2 :(得分:0)
Guy Steele的这篇论文提供了有关如何正确执行此操作的详细信息。它比你想象的要微妙得多。
答案 3 :(得分:0)
答案 4 :(得分:-1)
正如Oded在评论中提到的,不同的语言会以不同的方式做到这一点。例如,here's how Ruby 1.9 does it(在C中)。作为一项研究工作,您最好的选择是研究开源语言并了解它们是如何做到的。