【发布时间】:2022-10-24 18:59:49
【问题描述】:
例如,
0.0000000000000000000000000001
表示为(lo mid hi 标志):
1 0 0 1c0000
当上面除以 10 时,结果是 (lo mid hi flags)
0 0 0 0
但是当它乘以 0.1M 时,结果是 (lo mid hi flags)
0 0 0 1c0000
换句话说,根据 Decimal,0.0000000000000000000000000001 乘以 0.1 就是 0.0000000000000000000000000000。但除以 10 为 0。
下面显示了不同的结果:
var o = 0.0000000000000000000000000001M;
Console.WriteLine($"{o * 0.1M}");
Console.WriteLine($"{o / 10M}");
我需要能够在虚拟机中复制这种行为和所有其他十进制算术。有人可以指出我的规格或解释理由吗? System.Decimal.cs 似乎没有提供见解。
更新:所以这似乎只是十进制乘法实现中的一个错误。操作员应保留比例(根据 IEEE 754 2008),但乘法不会。
【问题讨论】:
-
@Matthew Watson,这与问题无关
-
@Frank,我假设 new Decimal( 0, 0, 0, 0, 0 ) == new Decimal( 0, 0, 0, 0, 0x1C )?如果是这样,您似乎在询问 .NET 的特定实现/版本的内部细节。然而,您的问题中没有提到版本。 // 至于使用同一个值的不同表示的合理性?它可能只是使用在每种情况下最自然的那个。
-
@ikegami 在数字上它们是相等的,但是底层表示不同并且显示输出不同,这意味着程序行为不同,因此我不希望实现因版本而异。我将用一个例子来更新这个问题。
-
回覆 ”但底层表示不同", 本身不相关。 // Re "显示输出不同,",但这是
-
@ikegami 是的,同意(见更新) - 请注意,对于十进制表示直接驱动显示输出等......
标签: c#