【发布时间】:2013-01-03 13:32:54
【问题描述】:
给定 2 个像这样的值:
decimal a = 0.15m;
decimal b = 0.85m;
其中a + b 将始终为1.0m,两个值都只指定到小数点后两位,并且两个值都是>= 0.0m 和<= 1.0m
对于x、a 和b 的所有可能的十进制值,是否保证x == total 始终为真?使用以下计算:
decimal x = 105.99m;
decimal total = (x * a) + (x * b);
或者在某些情况下x == total 只保留小数点后 2 位,但不能超过小数点?
如果a 和b 可以指定为无限小数位(在Decimal 允许的范围内),但只要a + b = 1.0m 仍然成立,会有什么不同吗?
【问题讨论】:
-
你是什么意思指定无限小数位?
0.85m和0.8500000000000000m不一样吗? -
@Rotem 二进制表示不同;我不确定当你乘法时它是否会导致行为差异。编辑:Apparently not -
Trailing zeroes do not affect the value of a Decimal number in arithmetic or comparison operations -
@Rawling 这个答案引用了 MSDN 的声明,否则:stackoverflow.com/a/1132777/860585
-
@CubeSchrauber 你看了吗?检查底部的
1和1.0000000000000000000000000000的示例输出。小数不像双精度/浮点数那样存储,而是使用基数 10,这会产生巨大的差异。 -
@CubeSchrauber 你是认真的吗?!当然它是以二进制形式存储的,因为一切都是(顺便说一句。
FF是十六进制,而不是二进制)。这并没有改变浮点数/双精度数和小数在内部表示的事实。浮点数使用(-1)^s * m * 2^e表示;这就是为什么它可以精确地表示 0.5 (1 * 2^-1) 但不能表示 0.3。另一方面,小数以 10 为底,使用(-1)^s * m * 10^e,因此如果 m 和 e 足够精确,我们可以精确表示所有小数,包括 0.3 (3 * 10^-1)。继续阅读IEEE 754。