簡體   English   中英

模糊調用Math.Round(int64 / int64,int)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM