我有一些集合返回的字段为
2.4200
2.0044
2.0000
Run Code Online (Sandbox Code Playgroud)
我想得到的结果
2.42
2.0044
2
Run Code Online (Sandbox Code Playgroud)
我尝试过String.Format,但它返回2.0000并将其设置为N0舍入其他值.
我们有一个有趣的问题,我们需要确定用户输入(文本框)的小数精度.基本上我们需要知道输入的小数位数,然后返回一个精确数字,最好用例子说明:
输入4500将产生结果1
4500.1输入将产生结果0.1
4500.00输入将产生结果0.01
4500.450输入将产生结果0.001
我们正在考虑使用字符串,找到小数分隔符,然后计算结果.只是想知道是否有更简单的解决方案.
给定 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仍然成立,会有什么区别吗?
我必须将尾随零添加到十进制值.不仅用于显示(因此Format不是选项),而是用于实际的底层数据,因为小数精度在我们的应用程序中很重要.
我试过了:
decimal value = 1M
decimal withPrecision = value + 0.000M;
Run Code Online (Sandbox Code Playgroud)
在许多情况下哪种方法效果很好......奇怪的是并非总体而言.我调试了一个情况,其中withPrecision中的值仍然是1M,没有看到运行时的值和立即窗口中相同的硬编码值有任何差异.我还使用了decimal.GetBits来找到差异 - 没有.
我试过(这里提出调整小数精度,.net):
decimal value = 1M
decimal withPrecision = value * 1.000M;
Run Code Online (Sandbox Code Playgroud)
效果很好 - 除了案例值为零.然后结果为0M,没有任何尾随零.我也不相信解决方案,在其他情况下也可能不起作用.
目前我在:
decimal value = 1M
decimal withPrecision = (value * 1.000M) + 0.000M;
Run Code Online (Sandbox Code Playgroud)
这在我目前发现的所有情况下都有效......但是看起来也不值得信赖.我还可以为零实现一个例外情况.
我认为Format并且Parse会工作.我不喜欢它.它看起来不是很快,我不明白为什么我必须将小数字放入一个字符串只是为了操纵它.
我开始相信这样一个简单的任务没有干净的解决方案.
我想在进行算术运算之前有效地确保十进制值至少具有N(在下面的示例中为3)位置.
显然,我可以用"0.000######....#"解析格式化,但效率相对较低,而且我正在寻找避免转换为字符串/从字符串转换的解决方案.
我尝试过以下解决方案:
decimal d = 1.23M;
d = d + 1.000M - 1;
Console.WriteLine("Result = " + d.ToString()); // 1.230
Run Code Online (Sandbox Code Playgroud)
这似乎适用于所有值<= Decimal.MaxValue - 1在使用Visual Studio 2015在Debug和Release版本中编译时.
但我怀疑编译器可能会优化(1.000 - 1).C#规范中有什么可以保证它始终有效吗?
或者是否有更好的解决方案,例如使用Decimal.GetBits?
UPDATE
继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 = …Run Code Online (Sandbox Code Playgroud) 昨天我问了一个关于小数及其内部精度的一般性问题.以下是我正在尝试解决的方案的具体问题.
我在SqlServer中有一个键入的列 - 十进制(18,6).当我获取这些值时,创建的.net小数与数据库中的精度相匹配.它们看起来像这样:
1.100000
0.960000
0.939000
0.844400
0.912340
Run Code Online (Sandbox Code Playgroud)
我需要根据这些规则提供(ToString)这些值:
所以,当n为3时,这就是我想要的:
1.100
0.960
0.939
0.8444
0.91234
Run Code Online (Sandbox Code Playgroud)
现在,我编写了一些代码,ToString的小数 - 删除所有尾随零,然后分析字符串寻找小数点并计算小数位数,以查看需要重新添加多少尾随零. 有没有更好的方法来实现这一目标?
另外,我知道我在上面的问题中说过ToString ...但是如果我可以在我的数据访问层的路上修改小数,这样消费者总是得到具有适当精度的小数,那就更好了.是否可以在没有字符串操作的情况下对小数本身执行此操作?