我知道大多數編程語言都有內置的功能來完成這些功能,但這些功能又是如何工作的?如何將double轉換爲字符串?
回答
一個簡單的(但非通用,幼稚和慢的方式):
- 數轉換成整數,然後通過10逐步除以該值來找出其位數以相反的順序。將它們連接在一起,就可以得到整數表示。
- 減去原始數字中的整數,現在逐步乘以10並找到小數點後的數字。用一個點和第二個字符串連接第一個字符串。
這有幾個問題,當然,:
- 緩慢的地獄;
- 不適用於負數;
- 不會給你非常小的或大量的指數表示法。
總而言之,這是一個想法,但不是一個很好的想法;我懷疑沒有這樣做的編程語言。
我看過C代碼,它只是簡單地將double轉換爲long並直接訪問這些位。 (如果我沒有記錯的話,它是來自Quake引擎的着名的優化的invsqrt()函數)。但問題是,你將不得不直接處理所有這些邊界案例(NaN,Inf等),並且規範並不是很短的讀/執行;) – tux21b 2010-10-13 19:50:06
由於Oded在評論中提到,不同的語言會以不同的方式做到這一點。作爲例子,here's how Ruby 1.9 does it(在C中)。作爲一項研究工作,您最好的選擇是研究開放源代碼的語言,看看它們是如何實現的。
所以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的這篇論文提供了有關如何正確執行此操作的詳細信息。它比你想象的要微妙得多。
- 1. Java:將double轉換爲字符串
- 2. 將double轉換爲字符串1
- 3. Swift 3將Double轉換爲字符串
- 4. Swift將double轉換爲字符串
- 5. 將double轉換爲字符串C++?
- 6. 將字符串轉換爲Double然後返回字符串
- 7. 將字符串轉換爲double,然後再將double轉換爲字符串而不丟失精度
- 8. 如何將「Double」轉換爲VBScript中的格式化字符串
- 9. 如何將double轉換爲Hex字符串?
- 10. 如何將字符串轉換爲jasper Reports中的Double值?
- 11. 如何將C++中的double轉換爲字符串
- 12. 如何將double轉換爲android中的字符串
- 13. 如何將字符串轉換爲double?我得到異常
- 14. 如何將pascal字符串轉換爲double?
- 15. 如何將字符串轉換爲c中的double值?
- 16. 錯誤:無效從字符串轉換爲double。我如何從字符串轉換爲double?
- 17. 字符串轉換爲double無效VB.net
- 18. 將不帶分隔符的字符串轉換爲Double/CLLocationDegrees
- 19. 如何將Double []轉換爲double []?
- 20. 如何將字符串的字符串轉換爲字符?
- 21. 如何轉換爲2精度的double - 字符串之後的字符串?
- 22. 將字符串轉換爲字符串
- 23. 如何將字符串[]轉換爲NameValueCollection?
- 24. 如何將字符串轉換爲NSdate?
- 25. 如何將字符串轉換爲UTF8?
- 26. 如何將HTMLElement轉換爲字符串
- 27. 如何將字符串轉換爲xml
- 28. 如何將字符串轉換爲LocalDateTime?
- 29. 如何將字符串轉換爲TimeSeriesDataItem
- 30. 如何將字符串轉換爲NSDate?
它在每種語言不同的做法,所以我會說,這是非常語言_dependent_,不是不可知。 – Oded 2010-10-13 19:33:46