2011-06-10 104 views
23

當我在C#中進行分區時,它會自動舍入。看到這個例子:C#正在向下舍入分部

double i; 
i = 200/3; 
Messagebox.Show(i.ToString()); 

這給我看一個包含「66」的消息框。 200/3實際上是66.66666〜然而。

有沒有一種方法可以避免這種舍入並保持66.6666667這樣的數字?

+9

這裏的重要教訓不只是整數算術是用整數完成的。相反,*操作數*的類型與程序分析更相關,而不是分配結果的類型。在C#中,我們幾乎總是從「內部」推到「外部」。我們不會說「哦,我看你把這個分配給一個double,所以我會做浮點算術」。相反,我們會說:「我看到你正在分割兩個整數,你必須要把結果看作一個整數,哦,你想把整數作爲一個整數,然後我們將它轉​​換爲double。」 – 2011-06-10 21:07:13

+0

我現在也在看這個「問題」。我可以從下面看到,爲什麼將兩個整數分開會導致一個整數,我對此很滿意。但是,我無法弄清楚的是:爲什麼C#/ VB.Net將200/3變成66?我們知道,如果我們做了以下「200/3.0」,我們以66.6666667結束。那麼,爲什麼這個數字減少到66,而不是四捨五入到67? 如果我這樣做,我結束了67: Convert.ToInt32(200/3.0) 所以我小數爲int變爲67,但在運行時將我的電話號碼轉換爲66? – Oxonhammer 2017-02-02 16:31:25

回答

37

i = 200/3正在進行整數除法。

嘗試之一:

i = (double)200/3

i = 200.0/3

i = 200d/3

聲明中的一個常量作爲一個做uble將會導致使用雙倍劃分的操作符。

6

200/3是整數除法,產生一個整數。

嘗試200.0/3.0

+0

或200/3.0。或200.0/3.或(雙)200/3.或200 /(雙)3.或者你想要做。 – JAB 2011-06-10 20:47:49

+0

@JAB沒時間想,只好先到那裏:) – 2011-06-10 20:48:59

+0

啊人!爲了成爲第一! – 2011-06-10 20:59:48

3

200/3這是一個整數除法。更改爲:200.0/3以使其成爲浮點部分。

0

200和3都是整數,所以結果將是一個整數。將其中一個轉換爲小數。

1

試試這個

i = 200d/3d; 

,它不會圓。

2

double i = 200.0/3;

double i =((double)200)/ 3;

會發生什麼是兩個整數執行整數除法,然後將整數答案分配給浮點數。爲避免這種情況,請始終將其中一個數字作爲雙精度來投射。

3

儘管答案實際上是66.666,但是發生的事情是正在計算200/3導致一個整數。整數然後被放置在浮動中。數學本身就是整數數學。要使其成爲浮點數,請使用200.0/3 .0將使其將200視爲浮點數,從而產生浮點數學運算。

5

可以指定格式字符串與所需號小數ponits的:因爲整數除法轉換成一個

double i; 
i = 200/3.0; 
Messagebox.Show(i.ToString("F6")); 
-1

所有給出的答案是錯的善良的雙倍,這完全不是所要求的(至少從性能的角度來看)。明顯的答案是小學數學,乘以10,再加5除,全部整數。

I =(2000/3 + 5)/ 10

您正趕上這裏德乙,這比執行雙重轉換完善好,但仍遠。你可以走得更遠,再乘以另一個因子,並加上其他的數值,這樣你就可以使用右移而不是將其除以10。這樣做的確切公式將作爲練習留給讀者。 (只是谷歌「與Multiply Shift的部門」)

祝您有愉快的一天。

+0

不可以。從OP的示例代碼中可以清楚地看出,他希望得到一個'double'結果而不截斷'int'。 – 2014-10-28 04:45:17