如何在不准确的计算上获得例外?

And*_*eas 5 c# precision decimal

每当我们需要高十进制精度时,我们使用小数来进行计算.有没有办法检查精度是否足以进行计算?

我想使以下代码抛出异常:

decimal almostMax = Decimal.MaxValue - 1;
decimal x = almostMax + 0.1m; // This should create an exception, since x equals almostMax.
Assert.AreEqual(x, almostMax); // This does NOT fail.
Run Code Online (Sandbox Code Playgroud)

它在实际代码中并不重要,但保证安全是件好事.

Goo*_*ide 3

这个扩展方法应该有帮助。它反转操作并检查是否可以根据结果正确计算输入参数。如果情况并非如此,则该操作会导致精度损失。

public static decimal Add(this decimal a, decimal b)
{
    var result = a + b;

    if (result - a != b || result - b != a)
        throw new InvalidOperationException("Precision loss!");

    return result;
}
Run Code Online (Sandbox Code Playgroud)

工作示例: https: //dotnetfiddle.net/vx6UYY

如果您想使用诸如+etc 之类的常规运算符,则必须采用Philipp Schmid 的解决方案并在您自己的十进制类型上实现运算符。