2011-03-01 54 views
3

至少在我看來,這是絕大多數bizzare Visual Studio 2010的行爲。我工作的MVC3項目,我複製的代碼行從另一個項目(VS2010也MVC1如果它事項),看起來像這樣:Visual Studio將1.1擴展到1.1000000000000001

target_height = height * 1.1 

當我把它粘貼到MVC3項目,它被擴大到

target_height = height * 1.1000000000000001 

現在,如果我輸入1.2,這很好,什麼都不會發生,但如果我鍵入1.12膨脹以1.1200000000000001。

target_height和height都是整數。爲什麼一個Visual Studio顯示1.1而其他展開爲1.1000000000000001?

這是怎麼回事?

+0

看這裏http://www.wiffin.com/他們也有«更多»鏈接瞭解更多關於主題的信息(是的,在列表中沒有C語言,但想法相同) – 2011-03-01 10:40:26

+0

你是說CLIPBOARD不保存文本,但一些其他數據和數據在PASTE上解釋? – 2011-03-01 10:58:43

+1

不,Visual Studio在粘貼和打字時解釋/替換它。 – Vnuk 2011-03-01 11:00:18

回答

1

我認爲它是自動完成瘋了,開始固定浮點常數爲「允許」的值。如在http://accessmvp.com/Strive4Peace/VBA/VBA_L1_02_Crystal.pdf中所寫,VB自動完成實際上只會提供「專門適用於該數據類型的東西」。 int * double可以理解爲不被截斷爲int * int(自動轉換總是隻發生在需要的時候),你看到的是1.1或1.12(epsilon = 1.11e-16)的雙重表示。

我認爲在發生這種情況時,仍然需要進一步檢查或驗證以瞭解確切的條件,但由於我沒有使用VB.NET或MVCx,因此我不願意這麼做。

-2

1.1和1.12一定不能有確切的二進制表示。

看到這一點:https://stackoverflow.com/questions/634206/what-every-programmer-should-know-about

+0

當然 - 問題是爲什麼VB.NET將數字解析爲浮點數,然後在複製並粘貼代碼時重新發射它,而不是僅複製複製和粘貼的字符。 – Rup 2011-03-01 17:05:44

+1

它不是粘貼本身,它是自動完成(或一些自動更正),它粘貼或打字後的行爲 - 另請參閱「...如果我輸入1.12它擴大了...」 – Suma 2011-03-01 19:23:16

0

數字文字1​​.1實際上並不代表數量11/10,而是表示數量round [(2^53 * 11)/ 10] /(2^53),這比數字略大於11/10。雖然這個數值可以精確地寫成十進制數字,有53個有效數字,但這樣做與使用英寸計量的捲尺確定長度爲1 3/16英寸並記錄測量結果爲30.1625mm 。如果無法區分長度小於或短於或短於1/64英寸的測量值,則測量值爲30.1625mm +/- 0.396875mm,其功能與30.2mm +/- 0.4毫米。

事實上,Visual Studio會選擇將最接近1.1的數字數量表示爲1.1000000000000001,這很奇怪。一方面,字面1.1將是相同值的更簡潔的表示。另一方面,即使上述文字與1.1不可區分,更詳細的表述並非沒有優勢。在某些情況下,瞭解數量是否比「看起來」要稍大或稍小一些可能會有所幫助。儘管數字文字1​​.1與數學數值11/10之間的差異在數值上不重要(將數字文字乘以十得出的精確值爲11),但是(1.1-1.0)和(1/10)之間的差異是顯而易見的(將數值表達式乘以10會產生一個大於1的值)。

+0

真的什麼都不明白 – 2017-03-10 12:22:20

+1

@VijaySB :計算機存儲數字的方式不能精確表示大多數小數;存儲1.1的嘗試將代替存儲計算機可以表示的最接近的數字,該數字稍微大一些,並且實際上比1.1000000000000000更接近1.1000000000000001。其效果有點像代表像1/3的小數部分0.3小數。如果有人試圖在27日中將其作爲一個分數來表示,那將是8/27(儘管原來是9/27)。 – supercat 2017-03-10 14:09:23