相关疑难解决方法(0)

删除尾随零

我有一些集合返回的字段为

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舍入其他值.

.net c# decimal

160
推荐指数
7
解决办法
13万
查看次数

确定输入数字的小数精度

我们有一个有趣的问题,我们需要确定用户输入(文本框)的小数精度.基本上我们需要知道输入的小数位数,然后返回一个精确数字,最好用例子说明:

输入4500将产生结果1
4500.1输入将产生结果0.1
4500.00输入将产生结果0.01
4500.450输入将产生结果0.001

我们正在考虑使用字符串,找到小数分隔符,然后计算结果.只是想知道是否有更简单的解决方案.

c# precision decimal decimal-point

9
推荐指数
3
解决办法
2万
查看次数

乘法时的小数精度

给定 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仍然成立,会有什么区别吗?

.net c# precision decimal

5
推荐指数
1
解决办法
3195
查看次数

C#decimal,如何添加尾随零

我必须将尾随零添加到十进制值.不仅用于显示(因此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会工作.我不喜欢它.它看起来不是很快,我不明白为什么我必须将小数字放入一个字符串只是为了操纵它.

我开始相信这样一个简单的任务没有干净的解决方案.

c# precision decimal digits

4
推荐指数
2
解决办法
3504
查看次数

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

我想在进行算术运算之前有效地确保十进制值至少具有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 + 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 = …
Run Code Online (Sandbox Code Playgroud)

.net c# language-specifications

4
推荐指数
1
解决办法
482
查看次数

没有舍入.net的十进制格式

昨天我问了一个关于小数及其内部精度的一般性问题.以下是我正在尝试解决的方案的具体问题.

我在SqlServer中有一个键入的列 - 十进制(18,6).当我获取这些值时,创建的.net小数与数据库中的精度相匹配.它们看起来像这样:

1.100000
0.960000
0.939000
0.844400
0.912340
Run Code Online (Sandbox Code Playgroud)

我需要根据这些规则提供(ToString)这些值:

  • 始终显示非零.
  • 显示在第n个小数位上或之前的尾随零.
  • 未显示第n个小数位后的尾随零.

所以,当n为3时,这就是我想要的:

1.100
0.960
0.939
0.8444
0.91234
Run Code Online (Sandbox Code Playgroud)

现在,我编写了一些代码,ToString的小数 - 删除所有尾随零,然后分析字符串寻找小数点并计算小数位数,以查看需要重新添加多少尾随零. 有没有更好的方法来实现这一目标?

另外,我知道我在上面的问题中说过ToString ...但是如果我可以在我的数据访问层的路上修改小数,这样消费者总是得到具有适当精度的小数,那就更好了.是否可以在没有字符串操作的情况下对小数本身执行此操作?

.net precision decimal

1
推荐指数
1
解决办法
2768
查看次数