gpt4 book ai didi

c# - 如何有效地确保一个十进制值至少有 N 位小数

转载 作者:太空狗 更新时间:2023-10-30 00:48:22 25 4
gpt4 key购买 nike

在进行算术运算之前,我想有效地确保十进制值至少有 N(在下面的示例中为 3)位。

显然,我可以使用 "0.000######....#" 进行格式化,然后进行解析,但它的效率相对较低,我正在寻找一种避免转换为/自转换的解决方案一个字符串。

我尝试了以下解决方案:

decimal d = 1.23M;
d = d + 1.000M - 1;
Console.WriteLine("Result = " + d.ToString()); // 1.230

当在调试和发布版本中使用 Visual Studio 2015 编译时,它似乎适用于所有值 <= Decimal.MaxValue - 1

但我一直怀疑编译器可能被允许优化 (1.000 - 1)。 C# 规范中是否有任何内容可以保证这将始终有效?

或者是否有更好的解决方案,例如使用 Decimal.GetBits

更新

根据 Jon Skeet 的回答,我之前曾尝试添加 0.000M,但这在 dotnetfiddle 上不起作用。所以我惊讶地发现 Decimal.Add(d, 0.000M) 确实有效。 Here's a dotnetfiddle比较 d + 000Mdecimal.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

所以至少某些行为似乎是依赖于编译器的,这并不令人放心。

最佳答案

如果您担心编译器会优化运算符(尽管我怀疑它永远不会这样做),您可以直接调用 Add 方法。请注意,您不需要先加后减 - 您只需添加 0.000m。例如:

public static decimal EnsureThreeDecimalPlaces(decimal input) =>
decimal.Add(input, 0.000m);

这似乎工作正常 - 如果您担心编译器将如何处理常量,您可以将这些位保留在一个数组中,只转换一次:

private static readonly decimal ZeroWithThreeDecimals =
new decimal(new[] { 0, 0, 0, 196608 }); // 0.000m

public static decimal EnsureThreeDecimalPlaces(decimal input) =>
decimal.Add(input, ZeroWithThreeDecimals);

不过,我认为这有点过头了 - 特别是如果您有良好的单元测试。 (如果您针对将要部署的已编译代码进行测试,编译器将无法在之后进入那里 - 我真的会惊讶地看到 JIT 介入这里。)

关于c# - 如何有效地确保一个十进制值至少有 N 位小数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47122370/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com