我知道如果.NET使用銀行家舍入來舍入2.5到2。但是,這可能如何:Math.Round圓了我
decimal point;
point =51 * 70/100;
Math.Round(point,0, MidPointRounding.AwayFromZero);
rounds to 35?
即使是奇數,我怎樣才能讓所有.5的整數變成大整數?
我知道如果.NET使用銀行家舍入來舍入2.5到2。但是,這可能如何:Math.Round圓了我
decimal point;
point =51 * 70/100;
Math.Round(point,0, MidPointRounding.AwayFromZero);
rounds to 35?
即使是奇數,我怎樣才能讓所有.5的整數變成大整數?
你在做整數除法。試試這個:
decimal point = 51m * 70m/100m;
這段代碼中的第二行已經給出了一個整數結果。
51,70,100類型爲int
,因此選擇整數乘法和除法運算符。整數乘法或除法的結果總是再次爲整型,在整數上使用/
進行劃分時,可能的小數位將被截斷。
聲明point = 51 * 70/100;
相當於
int tmp = 51 * 70; // result is 3570
tmp = tmp/100; // result is 35 (!!!)
point = (decimal)tmp; // point is 35m;
的解決辦法是改變你的代碼,以便它使用decimal
算術:
point = 51m * 70m/100m; // point is 35.7m
其實就足夠了操作數一個是類型爲decimal
。這可以通過使用後綴m
(用於貨幣)或通過使用類型轉換來實現。下面的例子也會給出想要的結果:
point = (decimal)51 * 70/100;
奇怪,爲什麼這是必須的,因爲OP已經在使用十進制? – 2010-11-03 10:19:26
@Peter van Kekem:51,70,100是'int'類型,因此選擇整數乘法和除法運算符。整數乘法或除法的結果總是再次爲整數類型,並且在使用整數上的「/」劃分時可能的小數位被截斷。 – 2010-11-03 10:23:01
@Peter van Kekem:因爲計算是在將整數分配給小數之前完成的。這只是一行代碼,但它不是全部的一項操作。第一個整數相乘得到一個整數,然後將整數分成一個整數,然後將結果保存爲小數(因爲整數可以隱式轉換爲小數而沒有任何問題,所以可以正常工作)。精度在達到小數之前就已經丟失了。 – David 2010-11-03 10:24:37