當然,一個人永遠不能比較浮動,從平等的計算結果點值,但總是用一個小的公差,如:不Math.Round(雙,十進制)總是返回一致的結果
double value1 = ...
double value2 = ...
if (Math.Abs(value1 - value2) < tolerance * Math.Abs(value1))
{
... values are close enough
}
但如果我使用Math.Round,我可以始終確保結果值是一致的,也就是說,即使四捨五入的值是無法完全用double表示的值,下面的Assert也會成功嗎?
public static void TestRound(double value1, double value2, int decimals)
{
double roundedValue1 = Math.Round(value1, decimals);
double roundedValue2 = Math.Round(value2, decimals);
string format = "N" + decimals.ToString();
if (roundedValue1.ToString(format) == roundedValue2.ToString(format))
{
// They rounded to the same value, was the rounding exact?
Debug.Assert(roundedValue1 == roundedValue2);
}
}
如果不是,請提供一個反例。
編輯
感謝astander通過,證明結果蠻力產生一個反例是不是在一般情況下「保持一致」。這個反在舍入結果16個顯著數字 - 因此在縮放時也無法以同樣的方式:
double value1 = 10546080000034341D;
double value2 = 10546080000034257D;
int decimals = 0;
TestRound(value1, value2, decimals);
不過,我也很想在一個更加數學解釋。對於任何更多的數學Stackoverflowers誰可以做以下任何的獎金upvotes:
找到一個反例,其中四捨五入的結果少於16顯著位。
確定一個數值範圍的量,舍入的結果將永遠是「一致的」如本文所定義(例如所有值,其中的數字顯著在舍入的結果的數量是< N)的。
提供一種生成反例的算法方法。
Eric Lippert撰寫了一篇關於浮點數的文章,他們可能會闡述一些光明.. http://blogs.msdn.com/ericlippert/ archive/tags/Floating + Point + Arithmetic/default.aspx – flesh