十进制 – 截断尾随零

我注意到.NET在小数和尾随零时有一些时髦/不直观的行为。

0m == 0.000m //true 0.1m == 0.1000m //true 

 (0m).ToString() == (0.000m).ToString() //false (0.1m).ToString() == (0.1000m).ToString() //false 

我知道必须遵守ECMA CLI标准。 但是,我想知道是否有内置的方法来截断十进制值的尾随零而不通过字符串表示(.ToString(“G29”)和解析后退技巧将起作用,但既不是快速也不是优雅的解决方案) ?

有任何想法吗? 非常感谢。

我认为你需要的是这个(我在这里回答的更多细节):

 public static decimal Normalize(decimal value) { return value/1.000000000000000000000000000000000m; } 

使用格式字符串指定ToString()的输出:

 (0.1m).ToString("0.#") -> "0.1" (0.10000m).ToString("0.#") -> "0.1" 

在格式中使用“0”指定数字或非指数0,使用“#”指定有效数字或抑制非有效数字0。

编辑:我在这里假设您担心数字的视觉(字符串)表示 – 如果没有,我将删除我的答案。

我不喜欢它,但它的工作原理(至少在某些范围内)……

  static decimal Normalize(decimal value) { long div = 1; while(value - decimal.Truncate(value) != 0) { div *= 10; value *= 10; } if(div != 1) { value = (decimal)(long)value / div; } return value; }