[英]Ambiguous call Math.Round ( int64 / int64, int)
我想做大量的百分比(int64:600851475143)
我的實際操作是
a = Math.round(i / 600851475143 * 100, 5);
使用i也是int64,介於1和600851475143之間。如果我是對的,則結果將介於0,00000%和100,00000%之間。
但是Visual Studio Express 2013告訴我方法'System.Math.Round(decimal,int)'和'System.Math.Round(double,int)'之間的模棱兩可。
如何視覺上說即使操作中有一些int64,好的方法也是System.Math.Round(decimal,int)?
獎勵:為了理解我的問題,我正在嘗試解決ProjectEuler.net的問題3:“ 13195的素數是5、7、13和29。什么是600851475143數字中最大的素數?”
我做了我的方法,它可以與13195一起使用。但是現在我必須與600851475143(在x64系統上)一起使用,但是我的算法似乎並沒有受到阻礙,我想添加一個百分比進度條來了解我的EXE是否崩潰或不。 我的變量是這個百分比...
我不想要Euleur問題3的答案,我只需要解決我的百分比問題...
如果i
是整數,則商是零或一,因為整數除以整數始終是C#中的整數。 你是說
a = Math.round(i / 600851475143.0 * 100.0, 5);
迫使計算加倍,或者
a = Math.round(i / 600851475143.0m * 100.0m, 5);
強制將其設置為小數。
錯誤消息是正確的-將整數結果轉換為十進制還是雙精度模棱兩可。 只是沒有指出更基本的錯誤。
順便說一句,此錯誤極為常見。 實際上如此普遍,以至於我的團隊正在研究靜態分析器以對其進行檢測。 現在刪除的答案實際上給出了我經常看到的錯誤形式:
a = Math.round((decimal)(i / 600851475143 * 100), 5);
這消除了歧義-顯然您的意思是decimal
重載-但計算以整數完成,四舍五入為整數, 然后轉換為十進制! 如果要進行強制轉換,它必須在一個操作數上 ,而不是結果上 。
在數字值后面加上M
標記將使其成為十進制值。 並對Round使用正確的重載。
var a = Math.Round(i / 600851475143M * 100, 5);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.