我使用十進制類型(.net),我想看看兩個數字是否相等。但我只想精確到小數點後10位。例如,拿這三個數字。我希望他們都是平等的。如何比較兩位小數到小數點後10位?
0.1123456789
0.11234567891
0.11234567899
的10進制數限制是從我的數據庫來了,所以我必須假設,第一個數字已經四捨五入,因此,我不能簡單地圓別人,因爲最後一個會總結。
我真的只想截斷到10位小數,但看不到如何做到這一點。
我使用十進制類型(.net),我想看看兩個數字是否相等。但我只想精確到小數點後10位。例如,拿這三個數字。我希望他們都是平等的。如何比較兩位小數到小數點後10位?
0.1123456789
0.11234567891
0.11234567899
的10進制數限制是從我的數據庫來了,所以我必須假設,第一個數字已經四捨五入,因此,我不能簡單地圓別人,因爲最後一個會總結。
我真的只想截斷到10位小數,但看不到如何做到這一點。
乘以10^10
並刪除小數部分怎麼樣?
decimal x2 = Math.Truncate(x * 10000000000);
decimal y2 = Math.Truncate(y * 10000000000);
Assert.Equals(x2, y2);
編輯:由Aaron的建議更改爲Math.Truncate
。謝謝。
乘以10000000000,轉換爲int,然後除以相同的數字。
這樣你截斷了多餘的數字。
您可能需要添加.5 * 10^-11才能在截斷前正確舍入。
或許這對你的作品:
If Decimal.Round(yourDec1, 10, MidpointRounding.AwayFromZero) = Decimal.Round(yourDec2, 10, MidpointRounding.AwayFromZero) Then
鮑比
四捨五入!=截斷。 – 2009-11-09 14:55:41
你比較浮點數以同樣的方式。下面是一些僞代碼,因爲我不知道在.NET呼籲絕對值,但它基本上將看起來像這樣(修改常數所需要的精確度):
if(Math.Abs(value1 - value2) < 0.0000000001)
{
// blah blah
}
return(Math.Abs(value1 - value2)<= precision); – 2009-11-09 15:06:29
@Russel,固定使用'Math.Abs'。 – 2009-11-09 15:13:02
感謝您的協助。 :D – 2009-11-09 15:36:27
乘以10^10 而不是轉換爲一個整數(這是32位)可能值得使用int64。一個int 32有一個大約20億的限制,當多重輸出給出的範圍在你的十進制值的+2.1和-2.1之間時,int64有一個更大的範圍,當乘以一個範圍大約+922,000,000到 - 9.22億的十進制值
當然這也將是錯誤的,大於2^31/10000000000. – Aaron 2009-11-09 15:01:31
@Aaron任何價值的,當然。 – 2009-11-09 15:04:03
將其更改爲Math.Truncate()而不是轉換爲int - 您仍然會失去一點頂端精度,但它會更「接近」。 – Aaron 2009-11-09 15:07:33