在进行算术运算之前,我想有效地确保十进制值至少有 N 位(在下面的示例中 = 3)。
显然我可以使用 then parse 进行格式化"0.000######....#"
,但它的效率相对较低,我正在寻找一种避免与字符串相互转换的解决方案。
我尝试了以下解决方案:
decimal d = 1.23M;
d = d + 1.000M - 1;
Console.WriteLine("Result = " + d.ToString()); // 1.230
Decimal.MaxValue - 1
在调试和发布版本中使用 Visual Studio 2015 编译时,这似乎适用于所有值 <= 。
但我怀疑编译器可能被允许优化 (1.000 - 1)。C# 规范中是否有任何内容可以保证这将始终有效?
还是有更好的解决方案,例如使用Decimal.GetBits
?
更新
跟进 Jon Skeet 的回答,我之前曾尝试添加0.000M
,但这在 dotnetfiddle 上不起作用。所以我很惊讶地看到它Decimal.Add(d, 0.000M)
确实有效。 这是一个 dotnetfiddle比较d + 000M
和decimal.Add(d,0.000M)
:结果与 dotnetfiddle 不同,但在使用 Visual Studio 2015 编译相同代码时相同:
decimal d = 1.23M;
decimal r1 = decimal.Add(d, 0.000M);
decimal r2 = d + 0.000M;
Console.WriteLine("Result1 = " + r1.ToString()); // 1.230
Console.WriteLine("Result2 = " + r2.ToString()); // 1.23 on dotnetfiddle
因此,至少某些行为似乎是依赖于编译器的,这并不令人放心。