2010-10-13 302 views
1

我知道大多數編程語言都有內置的功能來完成這些功能,但這些功能又是如何工作的?如何將double轉換爲字符串?

+4

它在每種語言不同的做法,所以我會說,這是非常語言_dependent_,不是不可知。 – Oded 2010-10-13 19:33:46

回答

0

一個簡單的(但非通用,幼稚和慢的方式):

  • 數轉換成整數,然後通過10逐步除以該值來找出其位數以相反的順序。將它們連接在一起,就可以得到整數表示。
  • 減去原始數字中的整數,現在逐步乘以10並找到小數點後的數字。用一個點和第二個字符串連接第一個字符串。

這有幾個問題,當然,:

  • 緩慢的地獄;
  • 不適用於負數;
  • 不會給你非常小的或大量的指數表示法。

總而言之,這是一個想法,但不是一個很好的想法;我懷疑沒有這樣做的編程語言。

+0

我看過C代碼,它只是簡單地將double轉換爲long並直接訪問這些位。 (如果我沒有記錯的話,它是來自Quake引擎的着名的優化的invsqrt()函數)。但問題是,你將不得不直接處理所有這些邊界案例(NaN,Inf等),並且規範並不是很短的讀/執行;) – tux21b 2010-10-13 19:50:06

-1

由於Oded在評論中提到,不同的語言會以不同的方式做到這一點。作爲例子,here's how Ruby 1.9 does it(在C中)。作爲一項研究工作,您最好的選擇是研究開放源代碼的語言,看看它們是如何實現的。

+0

所以Ruby基本上調用printf,這幾乎不是語言不可知。 – Jess 2010-10-13 19:43:30

2

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.

這足夠嗎?否則,您可能也希望查找實現...

相關問題