簡體   English   中英

比較 Double 和 Int 的最佳方法是什么?

[英]What's the best way to compare Double and Int?

C# 中的以下代碼不起作用:

int iValue = 0;
double dValue = 0.0;

bool isEqual = iValue.Equals(dValue);

那么,問題是:比較 Double 和 Int 的最佳方法是什么?

你真的不能天真地比較浮點和整數值; 特別是,因為有經典的浮點表示挑戰 可以做的是從另一個中減去一個,看看它們之間的差異是否小於您關心的某些精度,如下所示:

int iValue = 0;
double dValue = 0.0;

var diff = Math.Abs(dvalue - iValue);
if( diff < 0.0000001 ) // need some min threshold to compare floating points
   return true; // items equal

你真的必須自己定義equality對你意味着什么。 例如,您可能希望浮點值向最接近的整數四舍五入,因此 3.999999981 將“等於”4。或者您可能希望截斷該值,因此它實際上是 3。這一切都取決於您'正在努力實現。

編輯:請注意,我選擇 0.0000001 作為示例閾值......您需要自己決定什么精度足以進行比較。 只是意識到你需要在double的正常表示范圍內,我認為它被定義為Double.Epsilon

在任何語言中比較整數和浮點數的相等性是一個非常糟糕的主意。 它適用於非常簡單的情況,但是在您進行任何數學運算之后,程序執行您希望它執行的操作的可能性會急劇下降。

它與浮點數在二進制數字系統上的存儲方式有關。

如果您非常確定要使用它,請創建一個類來讓您擁有帶分數的數字。 使用一個 int 來保持整數,使用另一個 int 來保持分數。

這實際上取決於您認為“平等”的內容。 如果您希望您的比較在且僅當 double 與整數值精確匹配時返回 true(即沒有小數部分),您應該將 int 轉換為 double 以進行比較:

bool isEqual = (double)iValue == dValue;

如果像 1.1 這樣的東西被認為等於 1,你可以將 double 強制轉換為 int(如果你想完全忽略小數部分),或者如果你想說 1.9 等於 2,則將 double 舍入。

double val1 = 0;
double val2 = 0.0;
if((val1 - Double.Epsilon) < 0)
{
    // Put your code here
}

      OR

if((val2 - Double.Epsilon) < 0)
{
    // Put your code here
}

其中 Double.Epsilon 是 Double 的最低可能值。

來自https://docs.microsoft.com/en-us/dotnet/api/system.double.equals?view=netframework-4.8#System_Double_Equals_System_Double_

由於 Epsilon 定義了范圍接近零的正值的最小表達式,因此兩個相似值之間的差值幅度必須大於 Epsilon。 通常,它比 Epsilon 大很多倍。 因此,我們建議您在比較 Double 值是否相等時不要使用 Epsilon。

如果您沒有使用 double 進行任何計算,則可以使用== 這是因為整數可以精確地用雙精度表示(僅在 -2^53 和 2^53 之間)。

int iValue = 0;
double dValue = 0.0;

bool isEqual = iValue == dValue;

這返回真。

Equals不起作用的原因是==運算符會在比較之前自動將整數轉換為 double,而Equals不會,因此失敗。

這個答案有更多信息: https : //stackoverflow.com/a/52525223/15714398

如果您已使用雙精度數進行計算,則所有賭注都將取消,您必須對計算中的有效數字位數進行一些分析。

如今,幾乎唯一一次應該比較double類型的值和integerlong類型的值以實現嚴格相等的情況是,由於某種原因,人們被困在將整數作為浮點值存儲或傳遞,然后需要將它們轉換回來. 在大多數情況下,通過將整數類型轉換為double ,然后比較該轉換的結果,可以最容易地完成這種轉換。 請注意,如果數字超出范圍 ±2 52 ,則從longdouble轉換可能不精確。 盡管如此,在 64 位long可用之前的日子里, double是一種方便的整數存儲類型,對於 32 位int來說太大了,但又小到可以由double處理。

需要注意的是轉換longdouble ,然后做的比較將產生一個“平等”的結果,如果標稱值double不精確匹配的long價值,但表示可能最接近的double該值。 如果人們認識到浮點類型實際上並不表示單個精確值,而是表示一系列值,則這種行為是有意義的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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