乘法时的小数精度

Mat*_*ren 5 .net c# precision decimal

给定 2 个值,如下所示:

decimal a = 0.15m;
decimal b = 0.85m;
Run Code Online (Sandbox Code Playgroud)

其中a + b总是1.0m,两个值都只指定到小数点后 2 位,并且两个值都是>= 0.0m<= 1.0m

对于、和的所有可能的十进制值,是否保证始终为x == total真?使用以下计算:xab

decimal x = 105.99m;
decimal total = (x * a) + (x * b);
Run Code Online (Sandbox Code Playgroud)

或者是否存在x == total只保留小数点后两位但不超过这一点的情况?

a如果和b可以指定为无限小数位(尽可能多Decimal),但只要a + b = 1.0m仍然成立,会有什么区别吗?

Cha*_*ert 5

小数存储为符号、整数和代表小数位置的数字 10 的整数指数。只要数字的整数部分(例如 105.99 中的 105)不够大,那么 a + b 将始终等于 1。并且方程 (x * a) + (x * b) 的结果将始终具有四位小数的正确值。

与 float 和 double 不同,精度最多不会丢失数据类型的大小(128 位)

来自 MSDN:

Decimal 值类型表示范围从正 79,228,162,514,264,337,593,543,950,335 到负 79,228,162,514,264,337,593,543,950,335 的十进制数。小数值类型适用于需要大量有效整数和小数位且无舍入误差的财务计算。Decimal 类型并不能消除舍入的需要。相反,它最大限度地减少了舍入引起的错误。例如,以下代码生成的结果为 0.9999999999999999999999999999 而不是 1

decimal dividend = Decimal.One;
decimal divisor = 3;
// The following displays 0.9999999999999999999999999999 to the console
Console.WriteLine(dividend/divisor * divisor);
Run Code Online (Sandbox Code Playgroud)