2013-04-17 70 views
2

我是相當新的編程,並且最近重新使用C#(winforms)微軟「標準」計算器,但想問一個關於微軟在其「標準計算器」中使用的變量類型的問題, 。微軟標準計算器中使用的變量類型

要確定所使用的變量的類型,我在Microsoft標準計算器輸入的計算:

9分之88888888(8個8的)。

其結果是:9876543.111111111(9位小數)

我然後創建劃分2個號碼一個簡單的C#控制檯應用程序。

我第一次使用了「INT」類型,如預期,結果是9876543. 然後我用「雙」型,來到比較接近,其結果是9876543.11111111(8位小數) 我用十進制和輸出(再次如預期)有太多小數位! 我用float,輸出和int類型(9876543)相同。

float a = 88888888F; 
float b = 9F; 
float c = 0F; 
Console.WriteLine("a/b is: {0}", c = a/b); 
Console.ReadLine(); 

從上面的信息,我會說微軟使用類型「雙」,因爲這是最接近的小數位數。

但是..我不知道如果我在我的浮點類型的代碼中做了錯誤。 (你們可以讓我知道如果上面的代碼是錯誤的嗎?我故意鍵入流延浮動浮動,以防萬一,但最初沒有,並在結尾仍然得到相同的結果)

我試過這個鏈接關於浮點類型的一些信息,但並沒有真正的幫助:http://msdn.microsoft.com/en-gb/library/b1e65aza(v=vs.100).aspx

然後我嘗試了C++,並得到了類似的結果。

float a = 88888888; 
float b = 9; 
float c = a/b; 
cout << c; 

double aa = 88888888; 
double bb = 9; 
double cc = aa/bb; 
cout << cc; 

請原諒我,如果我失去了一些瘋狂明顯的東西!最好的答案是告訴我微軟使用哪種變量類型作爲他們的標準計算器,並提供某種形式的證據來支持它。此外,如果我在上面的代碼中發現了任何錯誤,我將不勝感激。

回答

2

精度爲double是15-16位。這就是爲什麼當你使用雙倍數時,你只有8位小數。 Decimals精確到28-29有效數字,這就是爲什麼你得到更多的小數位比你想要的。如果您想匹配Windows計算器並有9位小數,則可以使用decimal類型並使用Decimal.Round()將其設置爲9位小數位。

decimal a = 88888888; 
decimal b = 9; 
decimal c = 0; 
Console.WriteLine("a/b is: {0}", Decimal.Round(c = a/b, 9)); 
Console.ReadLine(); 

編輯 -

原因Windows計算器顯示不同的準確度是因爲它使用的arbitrary-precision arithmetic library。從Wikipedia

在Windows 95和更高版本中,它使用任意精度算術 庫替換標準IEEE浮點庫。它爲 操作(平方根,超越算子)提供基本操作(加法,減法, 乘法,除法)和32位精度的精度。

C#編譯器不使用相同的任意精度庫,這可能會解釋結果的差異。

+0

嘿,謝謝你,我不想手動告訴我的計算器從結果中切斷多少個小數位。我只是想知道爲什麼微軟計算器給了我一個答案,該公式爲9位小數,爲什麼我的C#代碼給了我8位小數。 – Zak

+0

@Zak - 我已經更新了我的答案。這可能解釋結果的差異。 – keyboardP

+0

嘿,這很有道理!非常感謝!!當我開始編寫這個計算器時,我認爲這將是一塊蛋糕,但實際上它比我想象的複雜得多! – Zak

2

如果你看看MSDN:http://msdn.microsoft.com/en-us/library/b1e65aza.aspx。你會知道浮法只有7位的精度,這在你的情況下,是9876543.

+0

謝謝,這個排除了浮動作爲微軟計算器使用的類型。我會給你一個有用的分數,但需要15分大聲笑。 – Zak

0
+0

嘿,非常感謝這個迴應,但是和上面一樣,我不想手動告訴我的計算器將小數點後9位數進行舍入,對microsoft calculator如何顯示9位小數點以及c#代碼顯示8位小數點的方式/ 。 – Zak

+0

這個計算器可以做到這一點,據我所知。更改爲科學模式,並做同樣的事情...你得到更多的1:9876543.1111111111111111111111111 –

+0

嘿,我唯一的問題是,如果我有另一個方程,如88888888/6,爲什麼微軟計算給:14814814.66666667(8十月)和我的c#應用程序給:14814814.6666667(7十二月)。我的觀點是,它當然不能說「在9個十進位中斷」(我也通過不斷劃分一個數字並得到了10位小數的答案來測試) – Zak